我有一个 python 小数(货币金额),我想将其四舍五入到小数点后两位。我尝试使用常规 round() 函数来执行此操作。不幸的是,这会返回一个浮点数,这使得继续下去变得不可靠:
>>> from decimal import Decimal
>>> a = Decimal('1.23456789')
>>> type(round(a, 2))
<type 'float'>
在小数模块中,我看到一些与舍入相关的事情:
我认为这些都没有真正提供我想要的东西(或者我错了?)。
所以我的问题是:有人知道如何可靠地将 Python Decimal 舍入到小数点后两位,以便我有一个 Decimal 可以继续吗?欢迎所有提示!
自 Python 3.3 起,您可以将
round()
与 Decimal
一起使用,它将返回一个 Decimal
:
>>> from decimal import Decimal
>>> round(Decimal('3.14159265359'), 3)
Decimal('3.142')
详情请参阅此答案。
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()
构建货币值的字符串表示形式。
你尝试的第一个对我来说效果很好。
import decimal
type(round(decimal.Decimal('1.23456789'),2))
<class 'decimal.Decimal'>
如果您使用的是 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
我想到了这一点:
import decimal
decimal.Decimal(str(round(a, 2)))
但我不知道它有多快。
@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)
不知道为什么他们没有内置功能,但我做了一个。 我知道这在技术上不是“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)