d == 9000000000000000000d无限循环

考虑以下代码:

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

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

为什么编译器不抛出任何exception?

双精度具有不同的精度,即固定数量的有效位。

双/浮点数(浮点数)由指数和mantisse组成(参见IEEE754标准)。 这个逻辑可以说,对于较大的数字,对于较小的数字,不需要高精度,而对于较小的数字,需要高精度。 因此,可能会发生d==d+1为真,因为+1对大数字没有任何作用(这也是为什么不应该使用浮点数代表货币的原因 ;同时比较浮点数也有问题,因为4*0.1!=0.4可能是真的,具体取决于实现和可能的舍入错误)。 这是在IEEE754标准中定义的,因此不会抛出任何exception(顺便说一句。编译器可以发出警告或错误,但不抛出任何exception)。

这与总是具有1的精度的整数形成对比。 因此,如果需要处理精度为1的大数,则需要考虑使用BigInteger实现或使用带有固定十进制数字和保证精度的十进制数。