代码之家  ›  专栏  ›  技术社区  ›  Konrad

十进制圆的奇怪行为

  •  1
  • Konrad  · 技术社区  · 6 年前

    使用时 decimal ,为什么舍入的行为总是相同的?

    不管我用什么 MidpointRounding.AwayFromZero 或者不总是这样 1.04 . 在第一种情况下,输出不应该是 1.03 ?

    Console.WriteLine(decimal.Round(1.035m, 2));
    Console.WriteLine(decimal.Round(1.035m, 2, MidpointRounding.AwayFromZero));
    

    https://github.com/dotnet/corefx/blob/664d98b3dc83a56e1e6454591c585cc6a8e19b78/src/Common/src/CoreLib/System/Decimal.cs#L612

    https://github.com/dotnet/corefx/blob/61d792e202d039c304c4f04ad816a57688f32fd4/src/Common/src/CoreLib/System/Decimal.DecCalc.cs#L2429-L2444

    5 回复  |  直到 6 年前
        1
  •  1
  •   Konrad    6 年前

    No:

    这种方法[ Round(decimal d, int decimals) ]相当于调用 Round(Decimal, Int32, MidpointRounding) 模式参数为的方法 MidpointRounding.ToEven .

    当d正好在两个四舍五入值之间的一半时,结果是 最右十进制位置的偶数 . 例如,当四舍五入为两位小数时,值2.345变为2.34,值2.355变为2.36。

    所以当四舍五入时 1.035 甚至,它变成 1.04 因为4是偶数,3不是。

        2
  •  1
  •   Scott Caldwell    6 年前

    默认的舍入方法是 MidpointRounding.ToEven ,所以在选择是否舍入到 1.03 1.04 ,选择末尾有偶数的那个, 一点零四 .

        3
  •  0
  •   Antoine V    6 年前

    作为 MSDN 说:

    public static decimal Round(
        decimal d,
        int decimals
    )
    

    小数:从0到28的一个值,指定小数位数为 圆到

    你要在2个地方打的,必须是1.04

        4
  •  0
  •   Shahul Hameed    6 年前

    在我看来,这是小数四舍五入时的预期行为。

    前任:

    1.035=>1.040生产,小数点后两位1.04

    1.033=>1.030生产,小数点后两位1.03

        5
  •  0
  •   Francois    6 年前

    默认的四舍五入不是要四舍五入吗?在这种情况下,5个四舍五入并结转…

    默认情况下,舍入方法使用舍入到最近的约定。下表列出了Round方法的重载和每个方法使用的舍入约定。 https://docs.microsoft.com/en-us/dotnet/api/system.math.round?view=netframework-4.7.2