请问,这是 Python 的 bug 吗?

2019-04-10 15:52:49 +08:00
 nvksie
>>> 4.8*12
57.599999999999994
>>>

如果最后是个 9 都可以理解,为啥最后是个 4 ??
3109 次点击
所在节点    Python
17 条回复
king1101
2019-04-10 16:01:01 +08:00
这些错误是由底层 CPU 和 IEEE 754 标准通过自己的浮点单位去执行算术时的特征。由于 Python 的浮点数据类型使用底层表示存储数据,因此你没办法去避免这样的误差。如果想要精确一点的话,可以使用 decimal 模块。(摘自 Python Cookbook )
xiaoheijw
2019-04-10 16:01:41 +08:00
python 默认的是 17 位小数的精度,前 16 位是准确的,第 17 位开始不准确
shuax
2019-04-10 16:04:28 +08:00
基础不牢固啊
shintendo
2019-04-10 16:13:44 +08:00
这不是 python 的 bug,而是几乎所有主流编程语言(使用 IEEE 754 格式存储浮点数)都有的问题
其本质原因是,在十进制里能精确表示的小数,用二进制不一定能精确表示
justou
2019-04-10 16:19:49 +08:00
每隔一段时间 python 都要出一个这种 bug
这是好事, 说明玩蛇的队伍一直都在壮大
wly19960911
2019-04-10 16:25:47 +08:00
https://www.guokr.com/article/27173/ 看这篇就好了。主要是真实值展示和二进制存储存储的差异问题。
hmzt
2019-04-10 18:15:57 +08:00
看来 c 语言作为入门语言还是很必要的,hh
shawndev
2019-04-10 18:17:14 +08:00
这是浮点数的 bug,如果嫌计算不准确,听说可以试一试 fortran
jhsea3do
2019-04-10 18:29:10 +08:00
nodejs 下有一款 big.js 很好用

python 下用 numpy 可以

import numpy as np
np.multiply(4.8, 1.2)
vcgo
2019-04-10 18:29:44 +08:00
浮点数运算丢失精度,不只是 Python,很多编程语言都是这样。
jhsea3do
2019-04-10 18:36:03 +08:00
@jhsea3do numpy 的语法我搞错了,以前搞过的,有点忘记了
whoami9894
2019-04-10 18:48:05 +08:00
是的,这是解释器的 bug,楼主快去社区反馈
mmdsun
2019-04-10 18:54:37 +08:00
快去恶补基础。不止是 py 不少语言都丢精度。

高精度运算比如价格:可以库里存分。用 long
或者整数小数分开处理。
java 可以用大数类运算。
tcitry
2019-04-10 20:03:37 +08:00
看看小数点后的二进制表示法?
nikolai
2019-04-10 20:09:07 +08:00
<amp-youtube data-videoid="PZRI1IfStY0" layout="responsive" width="480" height="270"></amp-youtube>
fan2006
2019-04-11 06:43:36 +08:00
from decimal import Decimal
print(Decimal('4.8')*12)
Qzier
2019-04-12 13:46:12 +08:00
与编程语言无关,与计算机浮点数的表示有关。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/553753

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX