python浮点不精确

2024-03-28 13:00:05 发布

您现在位置: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


Tags: falsetrueprint
1条回答
网友
1楼 · 发布于 2024-03-28 13:00:05

Python的浮点在内部表示为基数2中的有限位数(例如64位)。这意味着一些rational值不能被精确存储。与2/3在10进制中需要无穷多的小数位数并最终四舍五入到0.6666…6667相同,在2进制中有一些分数(不同的分数)需要类似的四舍五入

您可以使用decimal模块的decimal类以更熟悉的10进制表示来操作数字

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

为了完全避免有理数的精度问题,您必须使用分数模块。但是你将无法执行某些操作,并且仍然会受到无理值(以及超验值,如π和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

相关问题 更多 >