python 小数 - 四舍五入到最接近的整数美元(无美分) - 使用 ROUND_HALF_UP

发布于 2024-09-27 04:08:50 字数 464 浏览 3 评论 0原文

我正在尝试使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

双马尾 2024-10-04 04:08:51

我会尝试如下所示:

>>> from decimal import Decimal, ROUND_HALF_UP
>>> x = Decimal('2.47')
>>> x.quantize(Decimal('1'), rounding=ROUND_HALF_UP).quantize(Decimal('0.01'))
Decimal('2.00')

这里的关键部分是第一次调用: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 方法代替第一个量化调用:

>>> x.to_integral_value(rounding=ROUND_HALF_UP).quantize(Decimal('0.01'))
Decimal('2.00')

我看不出有任何强有力的理由更喜欢其中一个解决方案。

I'd try something like the following:

>>> from decimal import Decimal, ROUND_HALF_UP
>>> x = Decimal('2.47')
>>> x.quantize(Decimal('1'), rounding=ROUND_HALF_UP).quantize(Decimal('0.01'))
Decimal('2.00')

The key part here is the first call: x.quantize(Decimal('1'), rounding=ROUND_HALF_UP) gives x 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 with Decimal('1e1') it would round to the nearest multiple of 10.

Then the second quantize call just puts the extra two decimal places back in so that you get Decimal('2.00') coming out instead of just Decimal(2).

You could also use the to_integral_value method in place of the first quantize call, if you want:

>>> x.to_integral_value(rounding=ROUND_HALF_UP).quantize(Decimal('0.01'))
Decimal('2.00')

I can't see any strong reason to prefer either solution over the other.

为你鎻心 2024-10-04 04:08:51

我这样做了:

def currenctyUSD(val):
  valint = int(val)
  if float(val) > float(valint):
    valint = valint + 1
  return '{0:.2f}'.format(float(valint));

如果原始浮点值大于 float(int(val)),则原始浮点值有一些美分:),所以我们需要加 1。

I did this:

def currenctyUSD(val):
  valint = int(val)
  if float(val) > float(valint):
    valint = valint + 1
  return '{0:.2f}'.format(float(valint));

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文