代码改变世界

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

2025-02-10 16:41  钟铧若岩  阅读(90)  评论(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。