如何解决Python-如何为Decimal.quantize定义舍入比例
我写了一个函数,用于在点的右侧将数字四舍五入到一定数量的数字。但是我仍然不明白如何正确定义要与量化一起使用的标度。
在下面的示例中,res1
和res2
返回预期结果。我发现了一些不同的示例,这些示例将小数位数定义为浮点后有2个数字。使用“ 1.00”和“ 0.01”有什么区别?两者似乎都以相同的方式工作。
对于res3
,当我将浮点数传递给Decimal构造函数以获取number_3时,ROUND_HALF_UP
似乎在那儿不起作用。为什么会这样?我该如何定义从float生成的小数的比例?
如果我将浮点数作为输入是进行量化工作的唯一方法-首先将浮点数转换为字符串?
from decimal import Decimal,ROUND_HALF_UP
def custom_round(dec: Decimal,scale,rounding_mode):
return dec.quantize(Decimal(scale),rounding_mode)
number_1 = Decimal("10.026")
res1 = custom_round(number_1,"1.00",ROUND_HALF_UP)
print(res1) # 10.03
number_2 = Decimal("28.525")
res2 = custom_round(number_2,"0.01",ROUND_HALF_UP)
print(res2) # 28.53
number_3 = Decimal(28.525)
res3 = custom_round(number_3,ROUND_HALF_UP)
print(res3) # 28.52
解决方法
在这种情况下,“ 1.00”和“ 0.01”之间没有区别。与二进制浮点不同,十进制实例的概念是尾随有效的零,并且仅是内部指数quantize()
使用。确实,
>>> custom_round(Decimal("28.525"),"1234.56",ROUND_HALF_UP)
Decimal('28.53')
>>> custom_round(Decimal("28.525"),"000000.00",ROUND_HALF_UP)
Decimal('28.53')
也以相同的方式工作。
对于您的其他问题,请查看number_3
转换为的内容:
>>> number_3
Decimal('28.52499999999999857891452847979962825775146484375')
float->十进制转换是精确的,并且浮点数文字28.525在内部由二进制浮点数表示,该二进制浮点数仅近似于十进制28.525(不能完全表示为二进制浮点数-您可以而是使用最接近的可能的二进制近似值)。如图所示,该二进制近似值的精确十进制值比小数28.525小一点。这就是为什么四舍五入的原因。
,您的前两个示例以相同的方式工作,因为您给了它们等效的格式:两位小数。您给了一个字符串而不是精度的输入参数。您指定了两位小数精度,这就是您所得到的。要指定精度,请给它一个十进制值:
number_1 = Decimal("10.026")
res1 = custom_round(number_1,Decimal(1),ROUND_HALF_UP)
print(res1) # 10
number_2 = Decimal("28.525")
res2 = custom_round(number_2,Decimal(10)**-2,ROUND_HALF_UP)
print(res2) # 28.53
第三种方法的工作原理有所不同,因为您给它提供了一个不精确的float
值,该值不是精确 28.525。参见Is floating-point math broken?。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。