浮点数不能精确的表示十进制数,并且即使是最简单的数学运算也会产生误差。该错误是由于浮点数的存储方式引起的。
如在Python中,浮点数( float )默认精度为17位,在执行简单的浮点数加法计算时会产生如下误差:
1/3 + 10 > 10.333333333333334 1/3 + 10 -10 > 0.3333333333333339 (1/3 + 10 -10) == 1/3 > False
a = 1.1 b = 2.2 a + b - 3.3 > 4.440892098500626e-16解决方式
- 乘以极大整数
a = 1.1 b = 2.2 (a+b) == 3.3 > False (a+b)*10000 == 3.3*10000 > True (a+b)*10000/10000 > 3.3 ((a+b)-3.3)*10000 > 4.440892098500626e-12 ((a+b)*10000/10000)-3.3 > 0.0
- 调用decimal模块
注意:Decimal('str') 使用字符串
decimal 模块实现了IBM的”通用小数运算规范”
from decimal import *
Decimal(a) + Decimal(b)
> Decimal('3.300000000000000266453525910')
Decimal(str(a)) + Decimal(str(b))
> Decimal('3.3')
Decimal('1.1') + Decimal('2.2') == Decimal('3.3')
> True
float(Decimal(str(a)) + Decimal(str(b)))
> 3.3
- 误差极小视为0
def isZero(tininum):
if abs(tininum) < 0.0000001:
return True
return False
(5+2/3)-5,2/3 > (0.666666666666667, 0.6666666666666666) bb = ((5+2/3)-5)-2/3 -bb > -3.3306690738754696e-16 abs(-bb) < 0.0000001 > True isZero(bb) > True
相关文章
- 浅谈float浮点型的底层存储与运算
- python3-cookbook 3.2 执行精确的浮点数运算
- 关于Python里面小数点精度控制的问题



