Math.Round 四舍五入问题 解惑 !
前言:
一定要说 坑爹的微软! 坑爹的微软! 坑爹的微软! 重要的事情说 三遍 !
摘录 SMDN
MSDN 上显示 这就不是 四舍五入 这叫 五舍六入!
重要的提示! 在 .NET 4.5 自后 该方法就成了标准的 四舍五入了!! 2.0 3.0 3.5 4.0 都是 五舍六入!
解决办法 网上大神也给出过
摘录
C#中小数点后保留两位小数,四舍五入的函数及使用方法
2011-08-08 10:25 by 追忆似水流年, 14300 阅读, 2 评论, 收藏, 编辑
Math.Round(45.365,2) //Returns 45.36
C#中的Round()不是我们中国人理解的四舍五入,是老外的四舍五入,是符合IEEE标准的四舍五入,具体是四舍六入,下面的才是符合中国人理解的四舍五入
Math.Round(45.367,2,MidpointRounding.AwayFromZero);//45.37
Math.Round(45.365,2,MidpointRounding.AwayFromZero) //Returns 45.37
这个是非得想 使用 该方法 的解决方法 但是!!! 有BUG !! 输入 1.015 得到的结果是 1.01 !!!! 其他的没问题。
最终我建议不使用 这个方法 直接使用 ToString("F3") Fn n是几 就截取几位小数并且四舍五入!
此文章由人工翻译。 将光标移到文章的句子上,以查看原文。
|
译文
原文
|
Math.Round 方法 (Decimal, Int32)
将小数值按指定的小数位数舍入。
命名空间: System
程序集: mscorlib(在 mscorlib.dll 中)
异常 | 条件 |
---|---|
ArgumentOutOfRangeException |
decimals 小于 0 或大于 28。 |
OverflowException |
结果超出了 Decimal 的范围。 |
decimals 参数指定返回值中的小数位数以及范围 0 和 28。 如果 decimals 等于零,则返回整数。
如果 d 中 decimals 小数位置右侧的第一位数字的值为 5,则 decimals 位置中的数字向上舍入(如果为奇数)或不变(如果为偶数)。 如果 d 的精度小于 decimals,则返回 d 而不做更改。
此方法的行为遵循 IEEE 标准 754 的第 4 节。 这种舍入有时称为就近舍入或四舍六入五成双。 它可以将因单方向持续舍入中点值而导致的舍入误差降到最低。
若要控制 Round(Decimal, Int32) 方法使用的舍入类型,请调用 Decimal.Round(Decimal, Int32, MidpointRounding) 重载。