如何在Python中获取Decimal的Ceil()?
有没有办法在Python中获取高精度Decimal的向上取整值?
>>> import decimal;
>>> decimal.Decimal(800000000000000000001)/100000000000000000000
Decimal('8.00000000000000000001')
>>> math.ceil(decimal.Decimal(800000000000000000001)/100000000000000000000)
8.0
使用math模块会对数值进行四舍五入,返回的结果不够精确。
6 个回答
你可以通过上下文构造器中的精度和舍入模式选项来实现这个功能。
ctx = decimal.Context(prec=1, rounding=decimal.ROUND_CEILING)
ctx.divide(decimal.Decimal(800000000000000000001), decimal.Decimal(100000000000000000000))
补充说明:你应该考虑更改接受的答案。虽然可以根据需要增加prec
的值,但to_integral_exact
是一个更简单的解决方案。
要获取一个Decimal实例 x
的上限值,最简单的方法就是使用 x.to_integral_exact(rounding=ROUND_CEILING)
。这里不需要去调整上下文的设置。需要注意的是,这样做会设置一些标志,比如 Inexact
和 Rounded
;如果你不想改变这些标志,可以使用 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_exact
和 to_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
,这样可能会丢失一些信息,导致结果不正确。
这段代码是用来做一些特定操作的。它可能涉及到一些编程语言的基本语法和结构,但具体的功能和目的需要根据上下文来理解。
如果你对代码的某些部分不太明白,可以尝试逐行分析,看看每一行是做什么的,或者查找相关的编程基础知识来帮助理解。
总之,代码的作用就是让计算机按照我们的指令去完成某些任务。理解这些代码的关键在于多练习和多问问题。
x = decimal.Decimal('8.00000000000000000000001')
with decimal.localcontext() as ctx:
ctx.prec=100000000000000000
ctx.rounding=decimal.ROUND_CEILING
y = x.to_integral_exact()