数学.四舍五入

本文关键字:四舍五入 数学 | 更新日期: 2023-09-27 17:59:24

比方说:

Math.Round(2.5) //2.0
Math.Round(-2.5) //-2.0
Math.Round(2.5,MidpointRounding.ToEven) // 2.0
Math.Round(2.5,MidpointRounding.AwayFromZero) //3.0

问题:如果我用77777777.5更改数字,为什么结果是77777777.8.0而不是77777777.0

Math.Round(-77777777.5) // -77777778.0
Math.Round(-77777777.5,MidpointRounding.AwayFromZero) // -77777778.0
Math.Round(-77777777.5,MidpointRounding.ToEven) // -77777778.0

数学.四舍五入

默认的MidPointRounding模式为ToEven。在这种模式下,如文档所述(其中a是输入值),

最接近a的整数。如果a的分数分量为一半在两个整数之间,其中一个是偶数,另一个是奇数,则返回偶数。

-77777777.5有两个最接近的整数-77777777-77777778,但后者是偶数,所以这是返回的整数。

AwayFromZero模式中,-77777778明显比-77777777离零更远。

有两种舍入方式(不指定MidPointRounding只意味着它采用默认选项ToEven)。舍入的类型决定了使用0.5时会发生什么。

远离零:就像它所说的,它四舍五入到"远离零"的数字(因此到更大的绝对数)。例如:

2.5 -> 3
1.5 -> 2
0.5 -> 1
-0.5 -> -1
-1.5 -> -2
-2.5 -> -3

偶数:就像它说的,它四舍五入到最接近的偶数。例如:

2.5 -> 2
1.5 -> 2
0.5 -> 0
-0.5 -> 0
-1.5 -> -2
-2.5 -> -2

编辑:看起来你想要的是"接近零"四舍五入。据我所知,这在C#中不是一个选项。

第2版:由于默认的C#方法没有任何帮助,您必须编写一个自定义函数。在这里,你可以找到一个关于不同舍入方法的有趣博客。我自己还没有测试过,但这是对零舍入的建议:

public static int RoundToNearestRoundHalfTowardZero(decimal value)
{
    // If value is non-negative, subtract 0.5 and take the next
    // greater integer. If value is negative, add 0.5 and take the
    // next lower integer.
    if (value >= 0)
        return (int)Math.Ceiling(value - 0.5m);
    else
        return (int)Math.Floor(value + 0.5m);
}