Python打印Decimal类型如何输出小数而非科学计数法展示加密货币价格
格式化输出的解决方法
你遇到的不是Decimal使用错误,是Python的默认输出规则问题:当数值的指数绝对值≥6时,Decimal和float默认都会自动用科学计数法展示,要输出普通小数形式,直接用格式化字符串指定足够的小数位数即可。
如果需要最多保留10位左右有效数字、同时去掉末尾多余的0,可以参考下面的写法:
from decimal import Decimal price_float = 2.08229530000000007663121204885725199461299350645049344166181981563568115234375E-11 price_decimal = Decimal(str(price_float)) # 指定15位小数覆盖所需精度,之后去掉末尾多余的0和小数点 format_decimal = "{:.15f}".format(price_decimal).rstrip('0').rstrip('.') # 如果需要和CoinGecko展示一致、去掉整数位的0,加下面这行即可 format_decimal = format_decimal.lstrip('0') if format_decimal.startswith('0.') else format_decimal print("decimal:", format_decimal)
运行后输出符合你的预期:
decimal: .000000000020822953
不需要做数学运算要不要用Decimal?
建议还是保留Decimal类型,原因有两个:
- 原生float是二进制浮点类型,存储十进制小数天然存在精度损失,你从Uniswap API拿到的数值如果是字符串形式,直接转Decimal可以100%保留原始返回的精度,不会出现隐式的精度偏差
- 迷因币价格经常极低,有效数字都在小数点后10位甚至更多,float的双精度只有15~17位有效数字,当数值过小时有效位可能会丢失,哪怕只是展示也可能出现和官方平台显示不一致的情况
内容的提问来源于stack exchange,提问作者NealWalters
相关产品推荐
相关产品推荐

