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