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

2022-09-05 00:48:21

我想四舍五入到13.95。我尝试使用圆形a

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

答案 1

您遇到了浮点数的老问题,即并非所有数字都可以精确表示。命令行只是从内存中向您显示完整的浮点形式。

使用浮点表示,您的舍入版本是相同的数字。由于计算机是二进制的,因此它们将浮点数存储为整数,然后将其除以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("{:.2f}".format(a))
13.95
>>> print("{:.2f}".format(round(a, 2)))
13.95
>>> print("{:.15f}".format(round(a, 2)))
13.949999999999999

如果您只排在小数点后两位(例如,显示货币值),那么您有几个更好的选择:

  1. 使用整数并存储以美分(而不是美元)为单位的值,然后除以 100 以转换为美元。
  2. 或者使用定点数,如十进制

答案 2

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

您可以执行与以下操作相同的操作:

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

注1:以上返回一个字符串。为了获得浮点数,只需用以下字母包装:float(...)

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

注2:包装不会改变任何东西:float()

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