Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ InternalRound()

static void System.Decimal.DecCalc.InternalRound ( ref DecCalc d,
uint scale,
MidpointRounding mode )
inlinestaticpackage

Definition at line 1930 of file Decimal.cs.

1931 {
1932 d.uflags -= scale << 16;
1933 uint num = 0u;
1934 while (true)
1935 {
1936 uint num6;
1937 uint num5;
1938 if (scale >= 9)
1939 {
1940 scale -= 9;
1941 uint num2 = d.uhi;
1942 if (num2 == 0)
1943 {
1944 ulong low = d.Low64;
1945 ulong num4 = (d.Low64 = low / 1000000000);
1946 num5 = (uint)(low - num4 * 1000000000);
1947 }
1948 else
1949 {
1950 num5 = num2 - (d.uhi = num2 / 1000000000) * 1000000000;
1951 num2 = d.umid;
1952 if ((num2 | num5) != 0)
1953 {
1954 num5 = num2 - (d.umid = (uint)((((ulong)num5 << 32) | num2) / 1000000000)) * 1000000000;
1955 }
1956 num2 = d.ulo;
1957 if ((num2 | num5) != 0)
1958 {
1959 num5 = num2 - (d.ulo = (uint)((((ulong)num5 << 32) | num2) / 1000000000)) * 1000000000;
1960 }
1961 }
1962 num6 = 1000000000u;
1963 if (scale != 0)
1964 {
1965 num |= num5;
1966 continue;
1967 }
1968 }
1969 else
1970 {
1971 num6 = s_powers10[scale];
1972 uint num7 = d.uhi;
1973 if (num7 == 0)
1974 {
1975 ulong low2 = d.Low64;
1976 if (low2 == 0L)
1977 {
1978 if (mode <= MidpointRounding.ToZero)
1979 {
1980 break;
1981 }
1982 num5 = 0u;
1983 }
1984 else
1985 {
1986 ulong num9 = (d.Low64 = low2 / num6);
1987 num5 = (uint)(low2 - num9 * num6);
1988 }
1989 }
1990 else
1991 {
1992 num5 = num7 - (d.uhi = num7 / num6) * num6;
1993 num7 = d.umid;
1994 if ((num7 | num5) != 0)
1995 {
1996 num5 = num7 - (d.umid = (uint)((((ulong)num5 << 32) | num7) / num6)) * num6;
1997 }
1998 num7 = d.ulo;
1999 if ((num7 | num5) != 0)
2000 {
2001 num5 = num7 - (d.ulo = (uint)((((ulong)num5 << 32) | num7) / num6)) * num6;
2002 }
2003 }
2004 }
2005 switch (mode)
2006 {
2007 case MidpointRounding.ToEven:
2008 num5 <<= 1;
2009 if ((num | (d.ulo & (true ? 1u : 0u))) != 0)
2010 {
2011 num5++;
2012 }
2013 if (num6 >= num5)
2014 {
2015 break;
2016 }
2017 goto IL_01e5;
2018 case MidpointRounding.AwayFromZero:
2019 num5 <<= 1;
2020 if (num6 > num5)
2021 {
2022 break;
2023 }
2024 goto IL_01e5;
2025 case MidpointRounding.ToNegativeInfinity:
2026 if ((num5 | num) == 0 || !d.IsNegative)
2027 {
2028 break;
2029 }
2030 goto IL_01e5;
2031 default:
2032 if ((num5 | num) == 0 || d.IsNegative)
2033 {
2034 break;
2035 }
2036 goto IL_01e5;
2037 case MidpointRounding.ToZero:
2038 break;
2039 IL_01e5:
2040 if (++d.Low64 == 0L)
2041 {
2042 d.uhi++;
2043 }
2044 break;
2045 }
2046 break;
2047 }
2048 }
static readonly uint[] s_powers10
Definition Decimal.cs:205

References System.Runtime.Serialization.Dictionary, System.L, and System.Decimal.DecCalc.s_powers10.

Referenced by System.Decimal.Ceiling(), System.Decimal.Floor(), System.Decimal.Round(), System.Decimal.Truncate(), and System.Decimal.DecCalc.VarCyFromDec().