2024-03-28 13:00:05 发布
网友
为什么在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
x
print(y==0.75)
print(y==2.25)
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浮点值生成不精确的十进制值
Decimal(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
Python的浮点在内部表示为基数2中的有限位数(例如64位)。这意味着一些rational值不能被精确存储。与2/3在10进制中需要无穷多的小数位数并最终四舍五入到0.6666…6667相同,在2进制中有一些分数(不同的分数)需要类似的四舍五入
您可以使用decimal模块的decimal类以更熟悉的10进制表示来操作数字
请注意,我正在初始化字符串中的数字,因为
Decimal(0.3)
将从已经近似的0.3浮点值生成不精确的十进制值最后,这只是将问题转移到不同的值,如您在此处所见:
为了完全避免有理数的精度问题,您必须使用分数模块。但是你将无法执行某些操作,并且仍然会受到无理值(以及超验值,如π和e)的限制
相关问题 更多 >
编程相关推荐