You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何记住定义浮点数时指定的小数位数?

Python打印0.99显示正常的实现原理

首先明确前提:你已知的结论是正确的,0.99无法被64位双精度浮点数(也就是Python的float类型)精确存储,你执行num = 0.99赋值时,变量里实际存储的二进制值转成完整十进制就是0.98999999999999999112。

print(num)输出0.99的核心逻辑是浮点数转字符串的默认策略选择了最短可还原表示,规则如下:

  • 对于任意一个64位双精度浮点数,Python会优先寻找长度最短的十进制字符串,保证这个字符串再转回float时,和当前存储的浮点数完全相等
  • 对于你存储的0.99对应的近似浮点数来说,"0.99"刚好满足上述条件:float("0.99")和你变量里存的实际值完全一致,而且它的长度远小于完整展开的长串,所以默认输出就会用0.99,而不是展开所有小数位。

你用'{0:.20f}'.format(num)指定输出20位小数时,相当于覆盖了默认的最短表示策略,要求Python按固定精度展开浮点数的实际存储值,所以就会输出那个长串的近似值。你可以通过以下代码验证逻辑:

# 两个不同的十进制字符串转float后完全相等
print(float("0.99") == float("0.98999999999999999112"))  # 输出True

这个转换逻辑是Python 3.1版本之后正式引入的,底层用了David Gay的dtoa算法,专门用来高效实现浮点数到最短可还原十进制字符串的转换,兼顾了可读性和准确性,避免用户看到无意义的长串小数,同时保证输出的字符串可以无损还原回原来的浮点数。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:06:02