考虑以下代码:

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

为什么代码会陷入无限循环?

为什么编译器不引发任何异常?

最佳答案

double 具有变化的精度,即固定数量的有效位。

double 浮点数(浮点数)由指数和螳螂组成(请参见IEEE754标准)。这样做的逻辑是,对于较大的数字,对于较小的数字,不需要高精度,而对于较小的数字,则需要高精度。因此,可能会出现d==d+1为true的情况,因为+1对大量数字不执行任何操作(这也是为什么一个should not use floating point numbers for representing money;也比较浮点数是有问题的原因,因为4*0.1!=0.4可能为true,这取决于实现和可能的舍入错误)。这是在IEEE754标准中定义的,因此不会引发任何异常(顺便说一句,编译器可以发出警告或错误,但不会引发任何异常)。

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

10-05 19:19