今天在某.NETCore群中看到有人在问Math.Round的问题。其实这个问题之前有很多人遇到了,在此总结一下。
开发者为了实现小数点后2位的四舍五入,编写了如下代码,
varnum=Math.Round(12.,2);
代码非常的简单,开发者实际得到的结果是12.12,这与其所预期的四舍五入结果12.13相悖。
其实产生这个结果的原因是由于Math.Round默认使用的并非是四舍五入的原则,而是四舍六入五成双的原则。
四舍六入五成双所谓的四舍六入五成双,就是说当确定有效位数之后,有效位数的下一位如果小于等于4就舍去,如果大于等于6就进一,当有效位数的下一位是5的时候
如果5前面为奇数,就舍五进一如果5前面为偶数,就舍五不进(0是偶数)从统计学上讲,四舍六入五成双比四舍五入要更精确,因为大量计算的情况下,四舍五入逢五进一,会导致结果偏向大数。
例如:
1.15+1.25+1.35+1.45=5.2
如果有效位数是小数点后一位,使用四舍五入原则得到的结果
1.2+1.3+1.4+1.5=5.4
而使用四舍六入五成双原则得到的结果是
1.2+1.2+1.4+1.4=5.2
由此可见四舍六入五成双原则得到的结果更为精确。
Math.Round的四舍五入那么如何使用Math.Round实现预期的四舍五入呢?
其实C#中的Math.Round提供了非常多的重载方法,其中有两个重载方法是,
publicstaticdoubleRound(doublevalue,intdigits,MidpointRoundingmode);publicstaticdecimalRound(decimald,intdecimals,MidpointRoundingmode);
这两个方法都提供了第三个参数mode,mode是一个MidpointRounding的枚举变量,它有2个可选值
AwayFromZero-四舍五入ToEven-四舍六入五成双所以如果我们希望得到一个理想中四舍五入的结果,我们可以改用如下代码:
varnum=Math.Round(12.,2,MidpointRounding.AwayFromZero);回复学关闭