python 小数 - 四舍五入到最接近的整数美元(无美分) - 使用 ROUND_HALF_UP
我正在尝试使用 Decimal.quantize() 来实现以下目的: -
对于任何金额,以默认精度的 python 小数表示,我想使用 Decimal 将其四舍五入。 ROUND_HALF_UP 以便四舍五入后没有分值。
例如,给定 1.25,我试图获得 1.00(表示没有美分)
给定 1.49 我试图获得 1.00
给定 1.50 我试图获得 2.00
给定 1.87 我试图获得 2.00
给定 2.00 我试图获得 2.00
因此分有两个范围 - 0 分到 49 分;以及 50 美分到 99 美分。对于 49 分以下的美分,我想向下舍入,对于 50 分及以上的美分,我想向上舍入。我试图获得具有两位有效小数位的结果(始终为 00)。
我在这里没有任何负面价值观需要处理。我如何舍入我的美元以获得我想要的金额?除了quantize
之外还有其他选项吗?
I'm trying to use Decimal.quantize()
to achieve the following: -
For any amount of money, expressed as a python decimal of default precision, I want to round it using decimal.ROUND_HALF_UP
so that it has no cents after rounding.
For example, given 1.25, I'm trying to obtain 1.00 (signifying no cents)
given 1.49 I'm trying to obtain 1.00
given 1.50 I'm trying to obtain 2.00
given 1.87 I'm trying to obtain 2.00
given 2.00 I'm trying to obtain 2.00
So there are two ranges for the cents -- 0 cent to 49 cents; and 50 cents to 99 cents. For cents upto 49, I want to round down, for cents 50 and up I want to round up. I'm trying to obtain the result with two significant decimal places (which will always be 00).
I don't have any negative values to deal with here. How do I round my dollars to get the amount I want? Also is there any other option other than quantize
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我会尝试如下所示:
这里的关键部分是第一次调用:
x.quantize(Decimal('1'), rounding=ROUND_HALF_UP)
给出x
四舍五入使用给定的舍入模式到最接近的整数。第一个参数 (Decimal('1')
) 确定舍入结果的指数,因此如果将其替换为例如Decimal('0.1')
相反,它会四舍五入到最接近的十分之一,如果您将其替换为Decimal('1e1')
,它会四舍五入到最接近的10
倍数。然后,第二个
quantize
调用只是将额外的两位小数放回原处,这样您就可以得到Decimal('2.00')
而不是仅仅Decimal(2)
。如果您愿意,您还可以使用 to_integral_value 方法代替第一个量化调用:
我看不出有任何强有力的理由更喜欢其中一个解决方案。
I'd try something like the following:
The key part here is the first call:
x.quantize(Decimal('1'), rounding=ROUND_HALF_UP)
givesx
rounded to the nearest integer, with the given rounding mode. The first argument (Decimal('1')
) determines the exponent of the rounded result, so if you replaced it with e.g.,Decimal('0.1')
it would round to the nearest tenth, instead, and if you replaced it withDecimal('1e1')
it would round to the nearest multiple of10
.Then the second
quantize
call just puts the extra two decimal places back in so that you getDecimal('2.00')
coming out instead of justDecimal(2)
.You could also use the
to_integral_value
method in place of the first quantize call, if you want:I can't see any strong reason to prefer either solution over the other.
我这样做了:
如果原始浮点值大于 float(int(val)),则原始浮点值有一些美分:),所以我们需要加 1。
I did this:
If the original float value is greater than the float(int(val)) then the original float had some cents :) so we need to add 1.