You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Python 3.6.2中23位浮点数字符串互转及精度保持方案

解决Python大数字字符串转float后精度丢失的问题

嘿,这个问题我太熟悉了!你遇到的是64位双精度浮点数的精度天花板问题——Python里的float类型只能精确表示2^53以内的整数,而你手里的数字147211834412830112早就超出这个范围了,转成float的时候已经被近似处理,丢失了精确性,这时候再加0.001当然看不出变化啦。

要解决这个问题,推荐使用Python标准库中的decimal模块,它专门为精确的十进制计算设计,完全不会出现浮点精度丢失的情况。下面是修改后的代码:

from decimal import Decimal, getcontext

# 设置足够的精度,确保能容纳你的数字和需要的小数位
getcontext().prec = 20

a = '147211834412830112.000'
# 直接将字符串转为Decimal类型,保留完整精度
b = Decimal(a)
# 同样用Decimal表示要添加的小数,避免隐式转换
c = b + Decimal('0.001')
# 格式化输出为保留3位小数的字符串
print("{0:.3f}".format(c))

执行这段代码后,你会得到正确的输出:147211834412830112.001

补充说明:

  • decimal.Decimal直接从字符串初始化,不会像float那样在转换过程中丢失精度;
  • 设置getcontext().prec是为了确保计算过程中有足够的精度空间,你可以根据实际数字的长度调整这个值;
  • 如果你的场景是固定的三位小数,也可以考虑把字符串拆分为整数部分和小数部分,用Python的任意精度int处理整数部分后再拼接,但decimal的写法更简洁通用。

内容的提问来源于stack exchange,提问作者Alex

火山引擎 最新活动