【问题标题】:Python Decimal module not rounding as expectedPython Decimal 模块未按预期四舍五入
【发布时间】:2021-09-01 09:24:23
【问题描述】:

我正在尝试使用 Decimal 模块进行一些 FX 计算(而不是使用浮点数)。

但是,当我执行以下操作时,我没有得到预期值输出:

>>> from decimal import Decimal
>>> x = Decimal(1.3755)
>>> y = Decimal(1.2627)
>>> z = y/(1/x)
>>> print(z)
1.736843849999999839084452447
>>>

输出应该是:1.73684385

我认为使用小数可以解决这个问题。如何解决此舍入问题?

【问题讨论】:

  • 使用圆形,round(z, 5)
  • 我不想舍入,我只想得到完整的输出 1.73684385 而不必猜测要舍入到什么,在这种情况下我需要 round(z, 8)
  • 设置 getcontext().prec 这将给出你所期望的

标签: python decimal rounding


【解决方案1】:
from decimal import Decimal
x = Decimal('1.3755')
y = Decimal('1.2627')
print(y/(1/x))
# 1.736843850000000000000000000

使用str 构造Decimal 而不是实数。

【讨论】:

  • 请注意,这里仍然涉及到一定程度的运气 - 您需要四舍五入才能走正确的路。使用这些特定值可以“工作”,但如果您尝试使用x = Decimal('5.73')y = Decimal('6.7'),那么print(y/(1/x)) 会给出38.39099999999999999999999999 而不是预期的38.39100000000000000000000000
【解决方案2】:

需要字符串十进制对象:

>>> from decimal import Decimal
>>> x = Decimal('1.3755')
>>> y = Decimal('1.2627')
>>> z = y/(1/x)
>>> print(z)
1.736843850000000000000000000
>>>

否则它们仍将被视为常规 python 浮点数。

正如@schwobaseggl 提到的:

请注意,浮点数被传递给 Decimal 构造函数,因此精度已经丢失。 Decimal 构造函数没有机会知道所需的精度。结果仍然是一个十进制对象,但具有传递的浮点数的精度。

【讨论】:

  • 请注意,浮点数被传递给 Decimal 构造函数,因此精度已经丢失。 Decimal 构造函数没有机会知道所需的精度。结果仍然是一个十进制对象,但具有传递的浮点数的精度。
  • @schwobaseggl 是的,我会编辑它!谢谢人
【解决方案3】:

您可以使用0:.nf 对数字进行四舍五入,如下所示 :

print(z)
# 1.736843849999999839084452447
print("{0:.8f}".format(z))
# 1.73684385 

【讨论】:

  • 这根本无法解释为什么Decimal 对象会出现问题,这些对象在处理时会自行处理精度。这个问题与字符串格式无关。
  • 没有投反对票,但你怎么知道结果有多少相关数字?
【解决方案4】:

试试这个,这将帮助你,设置你的精度水平

>>> from decimal import *
>>> getcontext().prec = 6
>>> Decimal(1) / Decimal(7)
Decimal('0.142857')
>>> getcontext().prec = 28
>>> Decimal(1) / Decimal(7)
Decimal('0.1428571428571428571428571429')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 2014-08-26
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多