如何保留第18位小数?Python数值计算小数位数缺失问题解决
问题原因与解决方法
问题原因
这是浮点数精度限制导致的问题:
- Python中的
float是64位双精度浮点数,有效数字最多只有15-17位。 - 你的原始整数
42379943902701922是17位数字,当它被转换成浮点数时,无法被精确存储,会自动进行近似处理,丢失了末尾的那一位2。 - 最终
print输出的是这个近似后的浮点数的默认显示形式,自然就少了末尾的数字。
解决方法
想要得到精确的预期输出,有两种实用思路:
方法1:用decimal模块做精确十进制运算
decimal模块可以精准控制十进制数的精度,完全避免浮点数的近似问题:
from decimal import Decimal, getcontext # 设置足够的精度,这里至少需要18位 getcontext().prec = 18 my_number = 42379943902701922 result = Decimal(my_number) * Decimal('10') ** -18 print(result)
运行后会输出:0.042379943902701922
方法2:通过字符串操作直接格式化
既然原始数值是整数,我们可以直接用字符串拼接生成目标小数,彻底避开浮点数的坑:
my_number = 42379943902701922 num_str = str(my_number) # 除以10^18等价于把小数点往前移18位,原数17位,所以补0加小数点 result_str = f"0.{num_str}" print(result_str)
这段代码也能精准输出:0.042379943902701922
内容的提问来源于stack exchange,提问作者Exa
相关产品推荐
相关产品推荐

