d == 9000000000000000000d无限循环

时间:2015-12-19 17:09:26

标签: c#

考虑以下代码:

double d = 9000000000000000000d;
while (d == 9000000000000000000d)
{
   d += 500;
   Console.WriteLine(d);
}

为什么代码会遇到无限循环?

为什么编译器没有抛出任何异常?

1 个答案:

答案 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和一组固定的十进制数字并保证精度。