如何在Python中获取Decimal的Ceil()?

17 投票
6 回答
15345 浏览
提问于 2025-04-15 22:30

有没有办法在Python中获取高精度Decimal的向上取整值?

>>> import decimal;
>>> decimal.Decimal(800000000000000000001)/100000000000000000000
Decimal('8.00000000000000000001')
>>> math.ceil(decimal.Decimal(800000000000000000001)/100000000000000000000)
8.0

使用math模块会对数值进行四舍五入,返回的结果不够精确。

6 个回答

4

你可以通过上下文构造器中的精度和舍入模式选项来实现这个功能。

ctx = decimal.Context(prec=1, rounding=decimal.ROUND_CEILING)
ctx.divide(decimal.Decimal(800000000000000000001), decimal.Decimal(100000000000000000000))

补充说明:你应该考虑更改接受的答案。虽然可以根据需要增加prec的值,但to_integral_exact是一个更简单的解决方案。

35

要获取一个Decimal实例 x 的上限值,最简单的方法就是使用 x.to_integral_exact(rounding=ROUND_CEILING)。这里不需要去调整上下文的设置。需要注意的是,这样做会设置一些标志,比如 InexactRounded;如果你不想改变这些标志,可以使用 x.to_integral_value(rounding=ROUND_CEILING)。下面是一个例子:

>>> from decimal import Decimal, ROUND_CEILING
>>> x = Decimal('-123.456')
>>> x.to_integral_exact(rounding=ROUND_CEILING)
Decimal('-123')

与大多数Decimal方法不同,to_integral_exactto_integral_value 这两个方法不会受到当前上下文精度的影响,所以你不需要担心精度的问题:

>>> from decimal import getcontext
>>> getcontext().prec = 2
>>> x.to_integral_exact(rounding=ROUND_CEILING)
Decimal('-123')

顺便说一下,在Python 3.x中,math.ceil 的功能正是你想要的,只是它返回的是一个 int 而不是 Decimal 实例。这是因为在Python 3中,math.ceil 可以被自定义类型重载。而在Python 2中,math.ceil 会先把 Decimal 实例转换成 float,这样可能会丢失一些信息,导致结果不正确。

6

这段代码是用来做一些特定操作的。它可能涉及到一些编程语言的基本语法和结构,但具体的功能和目的需要根据上下文来理解。

如果你对代码的某些部分不太明白,可以尝试逐行分析,看看每一行是做什么的,或者查找相关的编程基础知识来帮助理解。

总之,代码的作用就是让计算机按照我们的指令去完成某些任务。理解这些代码的关键在于多练习和多问问题。

x = decimal.Decimal('8.00000000000000000000001')
with decimal.localcontext() as ctx:
    ctx.prec=100000000000000000
    ctx.rounding=decimal.ROUND_CEILING
    y = x.to_integral_exact()

撰写回答