为什么小数2.5M轮到2?

Den*_*nis -2 .net c# vb.net math

我必须错过.NET舍入的一些微妙之处.所以我看这个例子:

decimal num = 2.5M;
var result = Math.Round(num);
Run Code Online (Sandbox Code Playgroud)

为什么result = 2?(我本来应该预期3,因为它应该围绕)

ror*_*.ap 7

请参阅MSDN:

十进制Math.Round(Decimald)

将十进制值舍入为最接近的整数,并将中点值舍入为最接近的偶数(示例).

"中点"在这里意味着.5; 在你的情况下偶数是2.如果你这样四舍五入3.5,那就会导致4.

如果你想用"去零",而不是四舍五入,你可以使用System.MidpointRounding.AwayFromZero枚举:

decimal d = 2.5M;
decimal roundedD = Math.Round(d, MidpointRounding.AwayFromZero); // results in 3
Run Code Online (Sandbox Code Playgroud)

关于为什么它默认使用中点舍入(AKA"银行家舍入")而不是"远离零"舍入,请参阅此答案.据说它是一种更好的算法(即在许多迭代中更有效).

  • @Denis这被称为"银行家的四舍五入"..5恰好位于两个整数之间,所以总是向上舍入会使你的结果偏离现实. (3认同)
  • 他们为什么这样做呢?这听起来与这些年来教给我的舍入方式相反. (2认同)
  • @ bib1257*"我认为他们应该使用标准规则"*,如果你在金融部门工作,那就是标准规则.这就是为什么它被称为***Bankers***舍入. (2认同)

小智 5

如果要使用经典舍入

        decimal num = 2.5M;
        var result = Math.Round(num,0, MidpointRounding.AwayFromZero);
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅https://msdn.microsoft.com/zh-cn/library/system.math.round(v=vs.110).aspx