在c#中,Math.Round(2.5)的结果是2。
应该是3,不是吗?为什么在c#中它是2 ?
在c#中,Math.Round(2.5)的结果是2。
应该是3,不是吗?为什么在c#中它是2 ?
当前回答
您应该检查MSDN中的Math。轮:
这种方法的行为遵循IEEE标准754,第4节。这种四舍五入有时被称为最接近四舍五入,或银行家四舍五入。
您可以指定Math的行为。使用重载进行四舍五入:
Math.Round(2.5, 0, MidpointRounding.AwayFromZero); // gives 3
Math.Round(2.5, 0, MidpointRounding.ToEven); // gives 2
其他回答
以下是我必须解决的方法:
Public Function Round(number As Double, dec As Integer) As Double
Dim decimalPowerOfTen = Math.Pow(10, dec)
If CInt(number * decimalPowerOfTen) = Math.Round(number * decimalPowerOfTen, 2) Then
Return Math.Round(number, 2, MidpointRounding.AwayFromZero)
Else
Return CInt(number * decimalPowerOfTen + 0.5) / 100
End If
End Function
尝试使用1.905和2个小数将如预期的那样给出1.91,但Math.Round(1.905,2,MidpointRounding.AwayFromZero)给出1.90!数学。对于程序员可能遇到的大多数基本问题,Round方法是绝对不一致和不可用的。我必须检查如果(int) 1.905 * decimalPowerOfTen =数学。四舍五入(数字* decimalPowerOfTen, 2)因为我不想四舍五入什么应该四舍五入下来。
简单的方法是:
Math.Ceiling(decimal.Parse(yourNumber + ""));
来自MSDN的数学。Round(double a)返回:
最接近a的整数 a的分数分量是一半 两个整数之间,其中一个是 偶数和另一个奇数,然后是偶数 返回Number。
... 因此,在2和3中间的2.5被四舍五入为偶数(2)。这被称为银行家四舍五入(或四舍五入为偶数),是一种常用的四舍五入标准。
同一篇MSDN文章:
此方法的行为如下 IEEE标准754,第4节。这 四舍五入有时被称为 四舍五入到最接近的,或银行家的 舍入。它最小化舍入误差 这是持续舍入的结果 一个单一的中点值 方向。
您可以通过调用Math的重载来指定不同的舍入行为。回合采取midpointround模式。
我有这个问题,我的SQL服务器四舍五入0.5到1,而我的c#应用程序没有。所以你会看到两种不同的结果。
这是一个int/long的实现。这就是Java的舍入方法。
int roundedNumber = (int)Math.Floor(d + 0.5);
这可能也是你能想到的最有效的方法。
如果你想保持双精度并使用十进制精度,那么实际上只是使用基于小数点后多少位的10指数的问题。
public double getRounding(double number, int decimalPoints)
{
double decimalPowerOfTen = Math.Pow(10, decimalPoints);
return Math.Floor(number * decimalPowerOfTen + 0.5)/ decimalPowerOfTen;
}
你可以输入一个负的小数点作为小数点,这也很好。
getRounding(239, -2) = 200
您应该检查MSDN中的Math。轮:
这种方法的行为遵循IEEE标准754,第4节。这种四舍五入有时被称为最接近四舍五入,或银行家四舍五入。
您可以指定Math的行为。使用重载进行四舍五入:
Math.Round(2.5, 0, MidpointRounding.AwayFromZero); // gives 3
Math.Round(2.5, 0, MidpointRounding.ToEven); // gives 2