小数点后2位的四舍五入方法的结果错误



我对带有两个小数位的round((的结果感到困惑

a = 1352.845
res = round(a, 2)
=> 1352.85 (Right as I expected)
b = 578.005
res = round(b, 2)
=> 578.0 (Wrong, It would be 578.01 instead of 578.0)

情况b发生了什么?或者我误解了什么吗?

答案

from decimal import Decimal, ROUND_UP
Decimal('578.005').quantize(Decimal('.01'), rounding=ROUND_UP)

因为它需要用于货币,所以python round(((Banker’s Rounding(的默认约定在我的情况下是不正确的

虽然这可能会令人困惑,但这是因为大多数十进制分数不能完全表示为float类型。

如需进一步参考,请参阅:https://docs.python.org/3/tutorial/floatingpoint.html#tut-fp发布

实际上并没有错
这是银行家取整,是有意的实施细节。

如果你想保留"总是向上取整0.5"的方法,你可以这样做:

import decimal
#The rounding you are looking for
decimal.Decimal('3.5').quantize(decimal.Decimal('1'), rounding=decimal.ROUND_HALF_UP)
>>> Decimal('4')
decimal.Decimal('2.5').quantize(decimal.Decimal('1'), rounding=decimal.ROUND_HALF_UP)
>>> Decimal('3')

#Other kinds of rounding
decimal.Decimal('2.5').quantize(decimal.Decimal('1'), rounding=decimal.ROUND_HALF_EVEN)
>>> Decimal('2')
decimal.Decimal('3.5').quantize(decimal.Decimal('1'), rounding=decimal.ROUND_HALF_DOWN)
>>> Decimal('3')

回想一下你的物理/数学课,他们教你四舍五入是如何工作的。

如果最后一个数字是"5",并且您将其四舍五入,则如果它是奇数,则它的前一个数字将移动到下一个偶数,但如果它已经是偶数,则应保持不变。

相关内容

  • 没有找到相关文章

最新更新