Dart中对浮点数0.0累加0.1出现异常结果的原因咨询
为什么Dart中用while循环累加0.1会出现精度问题?
我在Dart中编写代码,想要打印0.1、0.2、0.3……1.0的序列,使用while循环实现了如下代码:
void main() { var i = 0.0; while (i <= 1) { print(i); i += 0.1; } }
但运行后得到了不符合预期的输出:
0.1 0.2 0.30000000000000004 0.4 0.5 0.6 0.7 0.7999999999999999 0.8999999999999999 0.9999999999999999
问题原因
这是浮点数的二进制存储特性导致的精度误差:
- Dart中的
double类型遵循IEEE 754标准,用二进制存储浮点数。但像0.1这样的十进制小数,转换成二进制后是无限循环的小数,无法被精确存储,计算机只能存储它的近似值。 - 每次累加这个近似值时,误差会不断累积。比如0.1的近似值加两次后,和精确的0.2之间的误差还不明显,但加三次后,累积的误差就会让结果变成0.30000000000000004这类偏离预期的数值。
- 另外循环没有输出1.0,是因为累加后的近似值永远达不到精确的1.0。当
i变为0.9999999999999999时,再加0.1的近似值会超过1.0,此时i <= 1的条件不满足,循环终止,所以不会打印1.0。
内容的提问来源于stack exchange,提问作者Muaaz Umar
相关产品推荐
相关产品推荐

