使用量化的舍入小数与内置的舍入函数有什么区别?

What is the difference between rounding Decimals with quantize vs the built in round function?

在 python 中使用内置的 decimal 模块时,我可以按如下方式舍入小数。

Decimal(50.212345).quantize(Decimal('0.01'))
> Decimal('50.21')

但我也可以使用内置的舍入函数舍入相同的数字

round(Decimal(50.212345), 2)
> Decimal('50.21')

为什么我在四舍五入小数时使用一个而不是另一个?在之前关于舍入小数的回答中,用户建议使用量化,因为内置的舍入函数会 return 一个浮点类型的值。根据我的测试,这些都是 return 十进制。除了语法之外,是否还有其他选择的理由?

return 类型并不总是 相同。 round() 与单个参数一起使用实际上是 return 一个 int:

>>> round(5.3)
5
>>> round(decimal.Decimal("5.3"))
5

除此之外,适合自己。 quantize() 如果你想要一个 deoimal 四舍五入到与你已经拥有的另一个小数“相同”的精度,那么 quantize() 特别方便。

>>> x = decimal.Decimal("123.456")
>>> x*x
Decimal('15241.383936')
>>> (x*x).quantize(x)
Decimal('15241.384')

看到了吗?执行此操作的代码不必知道 x 最初在小数点后有 3 位数字。只需将 x 传递给 quantize() 就会强制函数舍入到与原始 x 相同的精度,而不管它可能是什么。

quantize() 如果您想使用默认 nearest/even 以外的舍入模式,quantize() 也是必需的。

>>> (x*x).quantize(x, decimal.ROUND_FLOOR)
Decimal('15241.383')