之前觉得出现精度问题一般都是因为数字太长(数字太大,或者小数点后面的数过多),变量装不下了导致的。今天遇到一个问题:
S2sq = 0.142
n2 = 5
b = S2sq / n2 # 0.142 / 5
print(b)
这段代码中的 b
按道理来说应该是 0.142/5=0.0284,可是输出却是:
0.028399999999999998
当时遇到这个问题的时候就这么也想不通,Python 中的浮点数为什么像 0.0284 这样简单的数字都表示不了?于是便请教了 GPT 老师,得到的回答是这样的(虽然还是有点一知半解):
这是计算机的二进制存储导致的。
1️⃣ 二进制不能精确表示某些小数
计算机内部用 二进制浮点数 存储数字(IEEE 754 标准)。二进制浮点数表示为:
数字=符号×(1.小数部分)2×2指数
而像 0.0284
这样的十进制小数,有些是无限循环的二进制小数,类似十进制里 1/3=0.333…
具体到 0.0284
:
- 转成二进制大概是:
0.0284 ≈ 0.0000011100011010000111…₂
- 因为二进制位有限(Python 的浮点数大约是 53 位有效二进制),所以只能存储一个近似值。
- 这就是你看到的
0.028399999999999998
,它离0.0284
非常接近,但不是完全相等。
2️⃣ 为什么计算没问题?
计算机做运算时都是用这个近似值进行的,误差非常小: 0.028399999999999998−0.0284≈−2×10−180.028399999999999998 – 0.0284 \approx -2 \times 10^{-18}0.028399999999999998−0.0284≈−2×10−18
这对统计学或者工程计算几乎可以忽略不计。