协慌网

登录 贡献 社区

将浮点数限制为两个小数点

我想要a四舍五入到13.95

>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999

round函数不能按我预期的方式工作。

答案

您遇到浮点数的旧问题,无法表示所有数字。命令行只显示内存中的完整浮点形式。

在浮点数中,您的圆形版本是相同的数字。由于计算机是二进制的,它们将浮点数存储为整数,然后将其除以 2 的幂,因此 13.95 将以与 125650429603636838 /(2 ** 53)类似的方式表示。

双精度数字具有 53 位(16 位)的精度,而常规浮点数具有 24 位(8 位)的精度。 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.95
  >>> print("{0:.2f}".format(round(a,2)))
  13.95
  >>> print("{0:.15f}".format(round(a,2)))
  13.949999999999999

如果您只有两位小数,那么您有几个更好的选择:1)使用整数并以美分存储值,而不是美元,然后除以 100 转换为美元。 2)或使用十进制的固定点数。

有新的格式规范, 字符串格式规范迷你语言

您可以这样做:

"{0:.2f}".format(13.949999999999999)

请注意 ,上面返回一个字符串。为了得到浮点数,只需用float(...)换行:

float("{0:.2f}".format(13.949999999999999))

请注意 ,使用float()包装不会更改任何内容:

>>> x = 13.949999999999999999
>>> x
13.95
>>> g = float("{0:.2f}".format(x))
>>> g
13.95
>>> x == g
True
>>> h = round(x, 2)
>>> h
13.95
>>> x == h
True

内置的round()在 Python 2.7 或更高版本中运行良好。

例:

>>> round(14.22222223, 2)
14.22

查看文档