在浮点数计算中,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

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐