将浮点数限制为两个小数点
2022-09-05 00:48:21
我想四舍五入到13.95。我尝试使用圆形
:a
>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999
我想四舍五入到13.95。我尝试使用圆形
:a
>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999
您遇到了浮点数的老问题,即并非所有数字都可以精确表示。命令行只是从内存中向您显示完整的浮点形式。
使用浮点表示,您的舍入版本是相同的数字。由于计算机是二进制的,因此它们将浮点数存储为整数,然后将其除以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
如果您只排在小数点后两位(例如,显示货币值),那么您有几个更好的选择:
有新的格式规范,字符串格式规范迷你语言:
您可以执行与以下操作相同的操作:
"{:.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