上海自助建站系统,坡头手机网站建设公司,做设计排版除了昵图网还有什么网站,wordpress电影网盘今天在某.NET Core 群中看到有人在问Math.Round的问题。其实这个问题之前有很多人遇到了#xff0c;在此总结一下。开发者为了实现小数点后 2 位的四舍五入#xff0c;编写了如下代码#xff0c;var num Math.Round(12.125, 2);代码非常的简单#xff0c;开发者实际得到的… 今天在某.NET Core 群中看到有人在问Math.Round的问题。其实这个问题之前有很多人遇到了在此总结一下。开发者为了实现小数点后 2 位的四舍五入编写了如下代码var num Math.Round(12.125, 2);
代码非常的简单开发者实际得到的结果是 12.12, 这与其所预期的四舍五入结果 12.13 相悖。其实产生这个结果的原因是由于Math.Round 默认使用的并非是四舍五入的原则而是四舍六入五成双的原则。四舍六入五成双 所谓的四舍六入五成双就是说当确定有效位数之后有效位数的下一位如果小于等于 4 就舍去如果大于等于 6 就进一当有效位数的下一位是 5 的时候如果 5 前面为奇数就舍五进一如果 5 前面为偶数就舍五不进0 是偶数从统计学上讲四舍六入五成双比四舍五入要更精确因为大量计算的情况下四舍五入逢五进一会导致结果偏向大数。例如1.151.251.351.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提供了非常多的重载方法其中有两个重载方法是public static double Round (double value,int digits,MidpointRounding mode);
public static decimal Round (decimal d,int decimals,MidpointRounding mode);
这两个方法都提供了第三个参数mode, mode是一个MidpointRounding的枚举变量它有 2 个可选值AwayFromZero - 四舍五入ToEven - 四舍六入五成双所以如果我们希望得到一个理想中四舍五入的结果我们可以改用如下代码var num Math.Round(12.125, 2,MidpointRounding.AwayFromZero);