Python 3.x Python3.8四舍五入,带浮点或字符串的十进制构造函数
我在处理python十进制模块时遇到了一些奇怪的行为 示例如下: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))
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>)