为什么"%0.2f" % (.3)不返回"0.29"?
在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。