考虑以下代码:
double d = 9000000000000000000d;
while (d == 9000000000000000000d)
{
d += 500;
Console.WriteLine(d);
}
为什么代码会遇到无限循环?
为什么编译器没有抛出任何异常?
答案 0 :(得分:18)
double具有不同的精度,即固定数量的有效位。
双/浮点数(浮点数)由指数和mantisse组成(参见IEEE754标准)。逻辑与此相关的是,对于较大的数字,对于小数字,不需要高精度,而对于较小的数字,需要高精度。因此,可能会发生d==d+1
为真,因为+1
对大数字没有任何作用(这也是一个should not use floating point numbers for representing money的原因;同时比较浮点数也有问题{ {1}}可能是真的,具体取决于实现和可能的舍入错误)。这是在IEEE754标准中定义的,因此不会抛出任何异常(顺便说一下,编译器可以发出警告或错误,但不要抛出任何异常)。
与总体精度为4*0.1!=0.4
的整数形成鲜明对比。因此,如果您需要处理精度为1的大数字,则需要考虑使用BigInteger实现或使用decimal
和一组固定的十进制数字并保证精度。