gpt4 book ai didi

python - Python 中的“正确”四舍五入到小数点后 3 位

转载 作者:太空狗 更新时间:2023-10-30 00:38:57 31 4
gpt4 key购买 nike

我可能遗漏了一些重要的东西,但我想不出一种方法来在 Python (2.7) 中“正确”舍入 float /小数,至少保留三位小数。我所说的“正确”是指 1.2225 应四舍五入为 1.223,而 1.2224 应四舍五入为 1.222。

我知道 round 在设计上不适用于 Python 中的 float ,但我似乎无法让 Decimal 按预期运行,ceil 函数。最好寻找内置功能而不是自定义函数解决方法,但对两者都开放。

>>> x = 1.2225                                   # expected: 1.223
>>> round(x, 3)
1.222 # incorrect

>>> from math import ceil

>>> ceil(x * 1000.0) / 1000.0
1.223 # correct
>>> y = 1.2224 # expected: 1.222
>>> ceil(y * 1000.0) / 1000.0
1.223 # incorrect

>>> from decimal import Decimal, ROUND_UP, ROUND_HALF_UP

>>> x = Decimal(1.2225)
>>> x.quantize(Decimal('0.001'), ROUND_UP)
Decimal('1.223') # correct
>>> y = Decimal(1.2224)
>>> y.quantize(Decimal('0.001'), ROUND_UP)
Decimal('1.223') # incorrect

>>> y.quantize(Decimal('0.001'), ROUND_HALF_UP)
Decimal('1.222') # correct
>>> x.quantize(Decimal('0.001'), ROUND_HALF_UP)
Decimal('1.222') # incorrect

有没有办法得到想要的结果?

最佳答案

问题是 Decimal(1.2225) 不是您期望的那样:

>>> Decimal(1.2225)
Decimal('1.2224999999999999200639422269887290894985198974609375')

您正在使用 float 来创建小数,但该 float 对于您的用例来说已经太不精确了。如您所见,它实际上是一个 1.222499,因此它小于 1.2225,因此可以正确地将 向下舍入

为了解决这个问题,您需要通过将小数作为字符串传递来创建具有正确精度的小数。然后一切都按预期工作:

>>> x = Decimal('1.2225')
>>> x.quantize(Decimal('0.001'), ROUND_HALF_UP)
Decimal('1.223')
>>> y = Decimal('1.2224')
>>> y.quantize(Decimal('0.001'), ROUND_HALF_UP)
Decimal('1.222')

关于python - Python 中的“正确”四舍五入到小数点后 3 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41020797/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com