Python 中一个反直觉的精度问题

之前觉得出现精度问题一般都是因为数字太长(数字太大,或者小数点后面的数过多),变量装不下了导致的。今天遇到一个问题:

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

这对统计学或者工程计算几乎可以忽略不计。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇