浮点类型误差问题
现象
>>> 0.1
0.1
>>> 0.1+0.2
0.30000000000000004
>>> i=0
>>> while i<1:
... i=i+0.1
... print(i)
...
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999
1.0999999999999999
>>> 0.3==0.1+0.2
False
>>>
复制代码
以上现象发现 python 中浮点数计算是不精确的的
分析原因
Python 中的 float 类型使用 C 语言的 double 类型进行存储。 float 对象的值是以固定的精度(通常为 53 位)存储的二进制浮点数, 由于 Python 使用 C 操作,而后者依赖于处理器中的硬件实现来执行浮点运算。 这意味着就浮点运算而言,Python 的行为类似于许多流行的语 言,包括 C 和 Java。 以 0.1 为例,其二进制表示为 0.0001100110011001100110011001100110011001100110011001101 穷尽于 0.1
解决方法
使用 decimal 库
import decimal
a = decimal.Decimal("10.0")
b = decimal.Decimal("3")
print(10.0/3)
print(a/b)
print(round(3.6812,2))
print(round(3.6862,2))
------------
3.3333333333333335
3.333333333333333333333333333
3.68
3.69
复制代码
用整数代表小数,具体是如果保留小数点后两位,则用 0.01 使用 1 来代替
评论