为什么"%0.2f" % (.3)不返回"0.29"?

0 投票
2 回答
1227 浏览
提问于 2025-04-18 03:39

在IEEE 754标准中,0.3这个浮点数的实际值大约是0.29999999999999998。

根据这个,听起来Python在执行 "%0.2f" % (.3) 时应该会打印出"0.29"。但是,它实际上打印的是"0.30"。

那Python在背后做了什么,才能得到这个字符串表示呢?

补充说明:在《浮点数运算:问题与限制》的最后一句话很有意思:

在当前版本中,Python会根据最短的十进制小数来显示一个值,这个小数能正确地四舍五入回真实的二进制值。

2 个回答

3

把数字转换成小数的时候,通常是按照“四舍五入”的规则来处理的:如果你想要一个保留两位小数的小数表示,系统会给你最接近的那个小数。例如,把 0.29999999999999998 转换成小数,结果就是 0.30

其实,C语言在把浮点数转换成整数的时候,采用了“向零舍入”的方式,这有点奇怪,因为这样做并没有特别的好处。不过,这种做法影响了后来的很多编程语言,包括Python,它们在把浮点数转换成整数时也采用了截断的方法。需要注意的是,浮点数到整数的转换和截断的规则应该被视为例外,而其他类型的转换,包括小数之间的转换,通常都是按照“四舍五入”的规则来处理的。

5

四舍五入。在Python中,数字会被四舍五入,比如0.29999四舍五入到小数点后两位就是0.30。

撰写回答