有人可以向我解释为什么Math.Round(1.565,2) = 1.56
而不是1.57
?
答案 0 :(得分:2)
Math.Round()
使用了Banker的舍入算法。基本上它将以5结尾的任何数字朝向偶数。因此1.565向下(向6)向下但向上向1.575向(向8向上)。如果添加许多舍入数字,这可以避免累积误差累积。
答案 1 :(得分:1)
1.565的double
表示并不准确,并且略低于该数量 - 1.564999999999999946709294817992486059665679931640625左右。因此,当四舍五入到小数点后两位时,它会向下舍入。
即使你使用decimal
(它精确地表示小数分数)并尝试Math.round(1.565M,2)
,这也会向下舍入,因为Math.round(number, decimalPlaces)
将值放在一个值和接下来是最后一位数是偶数的那个 - 有时称为banker's rounding。例如,Math.round(1.575M,2)
会向上舍入。
答案 2 :(得分:1)
请参阅:Math.Round Method (Double, Int32)
由于代表可能导致精度损失 十进制值作为浮点数或执行算术 对浮点值的操作,在某些情况下为Round(Double, Int32)方法可能看起来不是将中点值舍入到最近的值 偶数值小数位数。这在图中说明 下面的示例,其中2.135舍入到2.13而不是2.14。 发生这种情况是因为内部方法将值乘以 10个数字,这种情况下的乘法运算受到a 失去精确度。
示例是:
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));
}
答案 3 :(得分:0)
这是因为内部方法将值乘以10digits,并且在这种情况下的乘法运算会受到精度损失的影响。 http://msdn.microsoft.com/en-us/library/system.math.round.aspx#Round5_Example和 http://msdn.microsoft.com/en-us/library/75ks3aby.aspx