Math.Round加倍.5

时间:2014-04-23 06:27:47

标签: c# double rounding

让我们说:

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更改号码,为什么结果是-77777778.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

2 个答案:

答案 0 :(得分:7)

默认MidPointRounding模式为ToEven。在此模式下,正如documentation(其中a是输入值)所解释的那样,

  

最接近a的整数。如果a的分数分数是中途   在两个整数之间,其中一个是偶数,另一个是奇数,然后是   偶数返回。

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

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

答案 1 :(得分:4)

有两种舍入方式(不指定MidPointRounding只意味着它采用默认选项,即ToEven)。舍入类型决定了0.5的发生情况。

远离零:就像它说的那样,它会转向“远离零”的数字(所以更大的绝对数字)。 E.g:

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

要均匀:就像它说的那样,它会向最接近的偶数舍入。 E.g:

2.5 -> 2
1.5 -> 2
0.5 -> 0
-0.5 -> 0
-1.5 -> -2
-2.5 -> -2
编辑:看起来你想要它'走向零'四舍五入。据我所知,这不是C#中的一个选项。

编辑2:由于默认的C#方法没有提供帮助,因此您将编写自定义函数。 Here你可以找到一个关于不同舍入方法的有趣博客。我自己没有对它进行过测试,但这是针对零舍入的建议:

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);
}