java,javascript,python中0.1+0.2=0.30000000000000004
在浮点数计算中,java,javascript,python甚至c语言计算0.1+0.2,打印结果出现意外的0.30000000000000004。

javascript结果

python打印结果

java打印结果
原因是浮点数0.1,0.2,0.3,...0,9除了0.5其余用二进制表示都是不精确的。
| 十进制 | 二进制(无限循环) | 循环节 |
| 0.1 | 0.0001100110011… | 0011 |
| 0.2 | 0.001100110011… | 0011 |
| 0.3 | 0.01001100110011… | 0011 |
| 0.4 | 0.01100110011… | 0011 |
| 0.5 | 0.1 | 无 |
| 0.6 | 0.100110011… | 0011 |
| 0.7 | 0.101100110011… | 0011 |
| 0.8 | 0.1100110011… | 0011 |
| 0.9 | 0.11100110011… | 0011 |
计算0.1的二进制推导方法:
0.1 × 2 = 0.2 → 取整数 0
0.2 × 2 = 0.4 → 取整数 0
0.4 × 2 = 0.8 → 取整数 0
0.8 × 2 = 1.6 → 取整数 1
0.6 × 2 = 1.2 → 取整数 1
0.2 × 2 = 0.4 → 取整数 0 ← 这里回到了 0.2,开始无限循环!
导致0.1+0.2不是结果0.3的原理:
1、计算机用二进制存储数字
2、0.1 和 0.2 转换成二进制是无限循环小数
3、计算机只能截取有限长度存储,导致微小误差
4、两个误差相加,最终结果就不是精确的 0.3
另外,为什么0.1+0.3=0.4?
这是一个超级经典、反直觉的问题!
明明 0.1 + 0.2 = 0.30000000000000004不精确,
但 0.1 + 0.3 竟然等于 0.4,完全精确!
直接运行验证:

核心原因:误差刚好「抵消」了!
我用极简图解给你讲清楚:
1. 先看每个数的真实存储(都是近似值)
计算机里存的不是真正的数学数字,而是近似值:
真正的 0.1 → 计算机存的是:比 0.1 大一点点
真正的 0.3 → 计算机存的是:比 0.3 小一点点
2. 相加时,误差互相抵消
plaintext
0.1(大一点点)
+ 0.3(小一点点)
------------------
= 0.4 (刚好完美!)
一个偏大、一个偏小,加起来误差没了!
用大白话总结
1、0.1 在二进制里是 无限循环 → 存的时候 四舍五入 变大了
2、0.3 在二进制里也是 无限循环 → 存的时候 四舍五入 变小了
3、这两个误差大小刚好一样,一加一减,完美抵消
4、所以结果 正好等于 0.4
更多推荐




所有评论(0)