在Java和C#中:
int a = (int)(-1.5 + 2.5);
int b = (int)(-1.55 + 2.55);
int c = (int)(1.45 + 2.55);
// a = 1; b = 0; c = 4;
有没有人可以解释为什么在小数点后面加2位或更多位数的正数加上正数会导致十进制数中断? “b = 0.99999999999999978”。
所以问题是 - 为什么“-1.5 + 2.5 = 1”,但“-1.55 + 2.55 = 0”?
答案 0 :(得分:3)
这是因为类型double
是近似值。
通常double
表示IEEE 754标准类型decimal64
Math.Round
可让您指定 MidpointRounding :ToEven - 当一个数字介于另外两个数字之间时,它会向最接近的偶数舍入。
AwayFromZero - 当一个数字介于另外两个数字之间时,它会向最接近零的数字四舍五入。
示例:
var val = (int)Math.Round((-1.55 + 2.55), 1, MidpointRounding.ToEven);
Console.WriteLine(val);
输出:1
初学者的常见错误是编写如下代码:
for (double i = 0.0; i == 6.0; i+=0.1)
{
Console.WriteLine(i);
}
提示:这将不会以~60步结束。
答案 1 :(得分:1)
使用double时,无法正确表示IEEE-754格式的某些小数。而是使用BigDecimal。 例如:
BigDecimal result = new BigDecimal("-1.55").add(new BigDecimal("2.55"));