我知道 Python (3.x) 应该四舍五入到偶数。为什么 round(0.975,2) = 0.97 但 round(0.975*100)/100 = 0.98?

I understand Python (3.x) is supposed to round to even. Why is round(0.975,2) = 0.97 but round(0.975*100)/100 = 0.98?

提问人:dalleaux 提问时间:2/15/2023 更新时间:2/15/2023 访问量:67

问:

所以问题在标题中。以下是一些更多详细信息:

法典:

a=0.975
print(round(a,2))
print(round(a*100)/100)

a=-0.975
print(round(a,2))
print(round(a*100)/100)

a=1.975
print(round(a,2))
print(round(a*100)/100)

a=-1.975
print(round(a,2))
print(round(a*100)/100)

打印输出为:

0.97
0.98
-0.97
-0.98
1.98
1.98
-1.98
-1.98

我想浮点错误以及如何处理浮点数有问题? 似乎在 -1 和 1 之间。可能是在移动浮点并在 5 之后创建一个具有更多数字的数字?round()round()

有人可以解释一下,是否有办法避免这种情况?

Python 舍入 精度

评论

3赞 Guy Incognito 2/15/2023
带有浮点数的 Python 舍入错误重复。另请参阅 docs.python.org/3/tutorial/floatingpoint.html
1赞 molbdnilo 2/15/2023
第一个的值实际上是 0.974999999999999999779553950749686919152736663818359375。其他人也有同样的问题。a

答:

2赞 kithuto 2/15/2023 #1

这是一个已知的 isue,带有 Python 的浮点数。 您可以看到 Python 使用十进制库存储为小数点的实际值:

from decimal import Decimal

print(Decimal(0.975)

为了避免这个问题,你可以在轮次操作之前使用十进制库。

from decimal import Decimal

a = 0.975
print(float(round(Decimal(str(a)),2)))

这将打印所需的 0.98 结果。

这里有 Decimal 库文档: https://docs.python.org/3/library/decimal.html