帅的一塌糊涂 发表于 2020-6-30 23:43:26

加法计算结果异常

在IDLE里输入 6.1 + 0.1 =6.19999999 为什么会这样怎么变成6.2

帅的一塌糊涂 发表于 2020-6-30 23:47:19

C:\Users\xiaobin\Desktop\pp

D473240632 发表于 2020-6-30 23:48:07

这是正常的,一般小数存在浮点误差

帅的一塌糊涂 发表于 2020-6-30 23:48:43

帅的一塌糊涂 发表于 2020-6-30 23:49:24

D473240632 发表于 2020-6-30 23:48
这是正常的,一般小数存在浮点误差

没有解决办法吗

sunrise085 发表于 2020-6-30 23:52:36

本帖最后由 sunrise085 于 2020-6-30 23:55 编辑

计算机是以二进制形式存储数据的。浮点数是以IEEE-754存储
float是4个字节,有效位数8位,范围:±3.40E38    IEEE-754存储4字节32位,其中尾数23位,阶码8位,符号位1位
double是8个字节,有效位数16位,范围:±1.79E308    IEEE-754存储8字节64位,其中尾数52位,阶码11位,符号位1位
所以小数要先转为二进制形式,再存储,这就导致了很多小数在转化成二进制的时候会有精度损失。就像你所遇到的6.2等等,然而有一些小数会比较精确,就是那些更好完整转化成二进制的小数,例如 0.5是2的-1次方,0.125是2的-3次方,这样的 小数一般不会出现那种很长的尾数。

Twilight6 发表于 2020-6-30 23:55:49

帅的一塌糊涂 发表于 2020-6-30 23:49
没有解决办法吗




可以用 Python 的标准库 decimal 这个更为精确

不过如果要精确到小数只能先把数值 str 为字符串然后这样做就不会产生误差了:

from decimal import Decimal
print(Decimal('6.1') + Decimal('0.1'))

你可以试着运行上述代码

返回结果:
6.2




2291437529 发表于 2020-7-1 02:41:18

本帖最后由 2291437529 于 2020-7-1 02:45 编辑

sunrise085 发表于 2020-6-30 23:52
计算机是以二进制形式存储数据的。浮点数是以IEEE-754存储
float是4个字节,有效位数8位,范围:±3.40E38 ...

直击原理
页: [1]
查看完整版本: 加法计算结果异常