rank | vote | view | answer | url |
---|---|---|---|---|
73 | 1190 | 2129025 | 19 | url |
限制浮点型到小数点后两位
我希望 a
可以转化成 13.95
>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999
round 并没有像我期待的那样得到 13.95
你遇到了典型的浮点数问题,那就是浮点数并不能代表所有的数值.命令行展示的只是内存中的完整的浮点数的形式.
上面的浮点数和你想要的结果是等价的.因为计算机是二进制的,它将浮点数存为整形,并且除以2的幂,所以 13.95 将会表示成 125650429603636838/(2**53).
双精度数值有53个字节来表示精度,而浮点型有24个字节表示.Python 使用 双精度浮点数 来存储数值.
例如,
>>> 125650429603636838/(2**53)
13.949999999999999
>>> 234042163/(2**24)
13.949999988079071
>>> a=13.946
>>> print(a)
13.946
>>> print("%.2f" % a)
13.95
>>> round(a,2)
13.949999999999999
>>> print("%.2f" % round(a,2))
13.95
>>> print("{0:.2f}".format(a))
13.952
>>> print("{0:.2f}".format(round(a,2)))
13.95
>>> print("{0:.15f}".format(round(a,2)))
13.949999999999999
如果你想要精确到小数点后2位有两个不错的选择:
- 使用整数并以美分存储值,而不是美元,然后除以100转换为美元。(没看懂,可能是 Python 的货币计算?)
- 使用 Python 的 decimal