如何将Python小数四舍五入到小数点后两位?

问题描述 投票:0回答:8

我有一个 python 小数(货币金额),我想将其四舍五入到小数点后两位。我尝试使用常规 round() 函数来执行此操作。不幸的是,这会返回一个浮点数,这使得继续下去变得不可靠:

>>> from decimal import Decimal
>>> a = Decimal('1.23456789')
>>> type(round(a, 2))
<type 'float'>

在小数模块中,我看到一些与舍入相关的事情:

  • ROUND_05UP
  • 圆形天花板
  • 向下舍入
  • 圆形_地板
  • ROUND_HALF_DOWN
  • ROUND_HALF_EVEN
  • ROUND_HALF_UP
  • ROUND_UP
  • 圆形

我认为这些都没有真正提供我想要的东西(或者我错了?)。

所以我的问题是:有人知道如何可靠地将 Python Decimal 舍入到小数点后两位,以便我有一个 Decimal 可以继续吗?欢迎所有提示!

python floating-point decimal rounding floating-point-precision
8个回答
25
投票

自 Python 3.3 起,您可以将

round()
Decimal
一起使用,它将返回一个
Decimal
:

>>> from decimal import Decimal
>>> round(Decimal('3.14159265359'), 3)
Decimal('3.142')

详情请参阅此答案


20
投票

您可以使用

quantize()
方法:

>>> import decimal
>>> decimal.getcontext().prec = 20
>>> a = decimal.Decimal(321.12345)
>>> a
Decimal('321.12344999999999117790139280259609222412109375')
>>> TWO_PLACES = decimal.Decimal("0.01")
>>> a.quantize(TWO_PLACES)
Decimal('321.12')

Python 文档有 一个很好的秘诀,介绍如何使用

Decimal
.quantize()
构建货币值的字符串表示形式。


8
投票

你尝试的第一个对我来说效果很好。

import decimal

type(round(decimal.Decimal('1.23456789'),2))

<class 'decimal.Decimal'>


1
投票

如果您使用的是 Jupyter Notebook,只需添加神奇函数

%precision 2
即可表示 2 位小数,依此类推。

但是如果您的值不是

float()
类型,那么您可以使用以下内容:

 from decimal import getcontext, Decimal
 getcontext().prec = 2
 # for example, take integer value
 mynum = 2
 type(mynum) # Int
 print round(Decimal(mynum), 2) # 10.0

1
投票

我想到了这一点:

import decimal
decimal.Decimal(str(round(a, 2)))

但我不知道它有多快。


0
投票

基于@countinglambdastosleep 的答案的更多 Pythonic 代码

from decimal import Decimal, ROUND_HALF_EVEN

def decimalize(n, prec=8):
    n = n if isinstance(n, Decimal) else Decimal(n)
    fmt = ".{}1".format("0" * (prec - 1))
    return n.quantize(Decimal(fmt), rounding=ROUND_HALF_EVEN)

为什么

ROUND_HALF_EVEN
?您可以在这里找到答案


0
投票

@Do Anh Tu,很好的答案...只需一个小更改即可处理浮点输入,除了 Decimal 和字符串输入之外,可以更改为 Decimal(n) 到 Decimal(str(n)),以下是整体代码:

from decimal import Decimal, ROUND_HALF_EVEN

def decimalize(n, prec=8):
    n = n if isinstance(n, Decimal) else Decimal(str(n))
    fmt = ".{}1".format("0" * (prec - 1))
    return n.quantize(Decimal(fmt), rounding=ROUND_HALF_EVEN)

0
投票

不知道为什么他们没有内置功能,但我做了一个。 我知道这在技术上不是“trueRound”,但如果您愿意,您可以更改它。 在 python 3.9 上测试

    from decimal import Decimal

    def trueRound(num: float or str, decimalPlaces: int) -> float:
        a = Decimal(str(num))
        places_str = "0."
        for i in range(decimalPlaces - 1):
            places_str += "0"
        places_str += "1"
        PLACES = Decimal(places_str)
        result = a.quantize(PLACES)
        return float(result)
© www.soinside.com 2019 - 2024. All rights reserved.