代码改变世界

为什么下面-11.5,执行之后是-12呢。 Math.Round(11.5)=12 Math.Round(-11.5)=-12

  钟铧若岩  阅读(10)  评论(0编辑  收藏  举报
在 C# 中,Math.Round 方法有多个重载版本,其舍入行为取决于你使用的具体重载以及所采用的舍入模式。当出现 Math.Round(11.5) 结果为 12,Math.Round(-11.5) 结果为 -12 的情况,这与 Math.Round 默认使用的舍入模式有关,下面为你详细解释:

舍入模式

Math.Round 方法默认使用的是 “四舍六入五取偶”(也称为 “银行家舍入法”)的舍入模式,该模式在国际标准 IEEE 754 中被定义,目的是为了减少在大量数据舍入计算时产生的累积误差。其规则如下:
  • 当要舍弃部分的最高位小于 5 时,直接舍去。
  • 当要舍弃部分的最高位大于 5 时,向前一位进 1。
  • 当要舍弃部分的最高位等于 5 时:
    • 如果 5 后面还有不为 0 的数字,则向前一位进 1。
    • 如果 5 后面没有其他数字或者全为 0,则看 5 前面的数字,若为奇数则进 1,若为偶数则舍去。

具体分析

Math.Round(11.5)

这里 11.5 要保留整数部分,需要对小数部分进行舍入。按照 “四舍六入五取偶” 的规则,5 后面没有其他数字,5 前面的数字 1 是奇数,所以要进 1,结果就是 12。

Math.Round(-11.5)

同理,对于 -11.5,同样是对小数部分进行舍入操作。5 后面没有其他数字,5 前面的数字 1 是奇数,所以也要进 1,由于是负数,进 1 后结果就是 -12。

代码验证不同舍入模式

如果你想使用传统的 “四舍五入” 模式,可以使用 MidpointRounding.AwayFromZero 参数,示例代码如下:
复制代码
using System;

class Program
{
    static void Main()
    {
        // 默认舍入模式(四舍六入五取偶)
        double result1 = Math.Round(11.5);
        double result2 = Math.Round(-11.5);
        Console.WriteLine($"默认舍入模式 - Math.Round(11.5): {result1}");
        Console.WriteLine($"默认舍入模式 - Math.Round(-11.5): {result2}");

        // 传统四舍五入模式
        double result3 = Math.Round(11.5, MidpointRounding.AwayFromZero);
        double result4 = Math.Round(-11.5, MidpointRounding.AwayFromZero);
        Console.WriteLine($"四舍五入模式 - Math.Round(11.5): {result3}");
        Console.WriteLine($"四舍五入模式 - Math.Round(-11.5): {result4}");
    }
}
复制代码
在上述代码中,首先使用默认的舍入模式进行计算,然后使用 MidpointRounding.AwayFromZero 指定传统的 “四舍五入” 模式进行计算并输出结果。当使用传统 “四舍五入” 模式时,Math.Round(11.5, MidpointRounding.AwayFromZero) 结果为 12,Math.Round(-11.5, MidpointRounding.AwayFromZero) 结果为 -11,这是因为按照 “四舍五入” 规则,正数 11.5 小数部分是 0.5 要进位得到 12,负数 -11.5 小数部分是 0.5 舍去小数部分得到 -11。
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示