python浮点不精度



为什么在python中,有些计算比其他计算更不精确?

x=0.1
y=x+x+x
print(y==0.3)
print(y)

返回
False
0.3000000000004

然而,如果我将x开始为0.25或0.5,print(y==0.75)print(y==2.25)都返回True。

Python的浮点数在内部以有限位数的2为基数表示(例如64)。这意味着不能精确地存储一些有理值。同样的,2/3在以10为底的情况下需要无限位小数,最后四舍五入到0.6666....6667,有以2为基数的分数(不同的分数)需要类似的舍入。

可以使用decimal模块的decimal类来操作更熟悉的十进制数。

from decimal import Decimal
x = Decimal("0.1")
y = x+x+x
print(y == Decimal("0.3")) # True
print(y) # 0.3

请注意,我正在初始化字符串中的数字,因为Decimal(0.3)会从已经近似的0.3浮点值中生成不精确的十进制值。

最后,这只是将问题移动到不同的值,如您所见:

x = Decimal(1)/Decimal(3)
y = x+x+x
print(y) # 0.9999999999999999999999999999

要完全避免有理数的精度问题,必须使用fractions模块。但是,你将无法执行一些操作,并且仍然会受到无理数值(以及π和e等超越值)的限制。

x = Fraction(1,3)  # 1/3
y = x+x+x
print(y)           # 1
x = Fraction(1,10) # 0.1
y = x+x+x
print(y)           # 3/10
print(float(y))    # 0.3

相关内容

  • 没有找到相关文章

最新更新