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
相关产品推荐
相关产品推荐

