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位有两个不错的选择:

  1. 使用整数并以美分存储值,而不是美元,然后除以100转换为美元。(没看懂,可能是 Python 的货币计算?)
  2. 使用 Python 的 decimal