有人可以向我解释为什么Math.Round(1.565,2) = 1.56
而不是1.57
吗?
4 回答
Math.Round()
使用银行家的舍入算法。基本上它会将任何以 5 结尾的数字四舍五入到偶数。所以 1.565 向下舍入(朝向 6)但 1.575 向上舍入(朝向 8)。如果您添加许多舍入数字,这可以避免累积舍入误差。
1.565的double
表示并不精确,并且略小于该数量 - 1.564999999999999946709294817992486059665679931640625 或附近。因此,当四舍五入到小数点后两位时,它会向下四舍五入。
即使您要使用 a decimal
(准确表示小数)并尝试Math.round(1.565M,2)
,这也会向下舍入,因为将Math.round(number, decimalPlaces)
一个值与下一个值之间的中间值舍入到最后一位为偶数的值 - 这有时称为银行家舍入。因此Math.round(1.575M,2)
,例如,将向上舍入。
请参阅:Math.Round 方法(Double,Int32)
由于将十进制值表示为浮点数或对浮点值执行算术运算可能导致精度损失,因此在某些情况下 Round(Double, Int32) 方法可能不会将中点值四舍五入到最接近的偶数数字小数位的值。这在以下示例中进行了说明,其中 2.135 舍入为 2.13 而不是 2.14。发生这种情况是因为该方法在内部将值乘以 10 位,并且这种情况下的乘法运算会损失精度。
例子是:
public static void Main()
{
double[] values = { 2.125, 2.135, 2.145, 3.125, 3.135, 3.145 };
foreach (double value in values)
Console.WriteLine("{0} --> {1}", value, Math.Round(value, 2));
}
发生这种情况是因为该方法在内部将值乘以 10 位,并且这种情况下的乘法运算会损失精度。http://msdn.microsoft.com/en-us/library/system.math.round.aspx#Round5_Example和 http://msdn.microsoft.com/en-us/library/75ks3aby.aspx