d==9900000000000000000d无限循环
本文关键字:无限循环 9900000000000000000d | 更新日期: 2023-09-27 18:27:36
考虑以下代码:
double d = 9000000000000000000d;
while (d == 9000000000000000000d)
{
d += 500;
Console.WriteLine(d);
}
为什么代码会运行到一个无限循环中?
为什么编译器不抛出任何异常
双精度不同,即有效位数固定。
双/浮点数(浮点数)由指数和尾数组成(参见IEEE754标准)。逻辑是,对于较大的数字,小数字不需要高精度,而对于小数字,则需要高精度。因此,d==d+1
可能是真的,因为+1
对大数字没有任何作用(这也是为什么不应该使用浮点数来表示货币的原因;比较浮点数也是有问题的,因为根据实现和可能的舍入误差,4*0.1!=0.4
可能是真)。这是在IEEE754标准中定义的,因此不会引发任何异常(顺便说一句,编译器可以发出警告或错误,但不会引发任何例外)。
这与精度始终为1
的整数形成对比。因此,如果您需要处理精度为1的大数字,则需要考虑使用BigInteger实现,或者使用具有固定小数位数集和保证精度的decimal
。