CodeSnippet.Cn
代码片段
Csharp
架构设计
.NetCore
西班牙语
kubernetes
MySql
Redis
Algorithm
Ubuntu
Linux
Other
.NetMvc
VisualStudio
Git
pm
Python
WPF
java
Plug-In
分布式
CSS
微服务架构
JavaScript
DataStructure
Shared
C#中的Math.Round,不知道坑了多少人!
0
Csharp
小笨蛋
发布于:2021年12月27日
更新于:2021年12月27日
243
#custom-toc-container
开发者为了实现小数点后 2 位的四舍五入,编写了如下代码, `var num = Math.Round(12.125, 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`提供了非常多的重载方法,其中有两个重载方法是, ```csharp 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);`
这里⇓感觉得写点什么,要不显得有点空,但还没想好写什么...
返回顶部
About
京ICP备13038605号
© 代码片段 2024