Python 3.x Python3.8四舍五入,带浮点或字符串的十进制构造函数

Python 3.x Python3.8四舍五入,带浮点或字符串的十进制构造函数,python-3.x,decimal,Python 3.x,Decimal,我在处理python十进制模块时遇到了一些奇怪的行为 示例如下: print(round(Decimal('0.005'),2)) >>> Decimal('0.00') print(round(Decimal(0.005),2)) >>> Decimal('0.01') print(round(Decimal('0.006'),2)) >>> Decimal('0.01') print(round(Decimal(0.006),2))

我在处理python十进制模块时遇到了一些奇怪的行为

示例如下:

print(round(Decimal('0.005'),2))
>>> Decimal('0.00')
print(round(Decimal(0.005),2))
>>> Decimal('0.01')


print(round(Decimal('0.006'),2))
>>> Decimal('0.01')
print(round(Decimal(0.006),2))
>>> Decimal('0.01')

有人能解释为什么会发生这种情况,以及我如何将
Decimal('0.005')
转换为
Decimal(0.005)

您注意到十进制数字的浮点表示形式

>>> Decimal(0.005) 
Decimal('0.005000000000000000104083408558608425664715468883514404296875')
这等于0.005吗

>>> 0.005 == 0.005000000000000000104083408558608425664715468883514404296875
True
在舍入阶段,由于值为>
0.005
,因此舍入为
0.01

这是预期的行为

如何将十进制('0.005')转换为十进制(0.005)

然而,这可能不是你想要的。在我看来,适当的做法是将输入忠实地转换为十进制,然后明确地应用舍入策略

将浮点输入转换为十进制

有两种选择

  • 应用
    str
    您的输入

    >>> Decimal(str(0.005)) == Decimal(str('0.005'))
    True
    
  • 将浮点数转换为十进制后进行量化
    。quantize还允许您四舍五入并指定精确的四舍五入方法。请注意,在这里,我没有使用quantize方法进行舍入(该示例将在下面进一步介绍)。在这里,我指定与输入相同的位数

    >>> Decimal(0.005).quantize(Decimal('1.000'))
    Decimal('0.005')
    
  • 要进行舍入,您可以调用
    Decimal
    对象上的
    round
    ,就像您所做的那样。或者您可以使用
    Decimal.quantize
    方法

    Decimal(0.005).quantize(Decimal('1.00'), rounding=<ROUNDING_METHOD>)
    
    Decimal(0.005)。量化(十进制('1.00'),舍入=)
    
    可找到可用的
    四舍五入\u方法

    如果希望始终向上取整
    Decimal(0.005)
    ,请指定
    ROUND\u HALF\u up
    。但是,请注意,python 3的默认舍入行为是
    舍入(也称为银行家舍入),这就是为什么
    舍入(十进制('0.005'),2)
    输出
    0.00

    Decimal(0.005).quantize(Decimal('1.00'), rounding=<ROUNDING_METHOD>)