让我们说:
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
答案 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);
}