有没有办法在python中获得高精度Decimal的ceil?
>>> import decimal;
>>> decimal.Decimal(800000000000000000001)/100000000000000000000
Decimal('8.00000000000000000001')
>>> math.ceil(decimal.Decimal(800000000000000000001)/100000000000000000000)
8.0
数学舍入值并返回非精确值
答案 0 :(得分:21)
获取十进制实例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
实例。这是有效的,因为{3}在Python 3中对于自定义类型是可重载的。在Python 2中,math.ceil
只是首先将math.ceil
实例转换为Decimal
,可能会丢失过程中的信息,所以你最终可能会得到不正确的结果。
答案 1 :(得分:5)
x = decimal.Decimal('8.00000000000000000000001')
with decimal.localcontext() as ctx:
ctx.prec=100000000000000000
ctx.rounding=decimal.ROUND_CEILING
y = x.to_integral_exact()
答案 2 :(得分:3)
您可以使用Context构造函数的精度和舍入模式选项来执行此操作。
ctx = decimal.Context(prec=1, rounding=decimal.ROUND_CEILING)
ctx.divide(decimal.Decimal(800000000000000000001), decimal.Decimal(100000000000000000000))
编辑:您应该考虑更改已接受的答案。虽然可以根据需要增加prec
,但to_integral_exact
是一个更简单的解决方案。
答案 3 :(得分:0)
>>> decimal.Context(rounding=decimal.ROUND_CEILING).quantize(
... decimal.Decimal(800000000000000000001)/100000000000000000000, 0)
Decimal('9')
答案 4 :(得分:0)
def decimal_ceil(x):
int_x = int(x)
if x - int_x == 0:
return int_x
return int_x + 1
答案 5 :(得分:0)
只需使用效力来做到这一点。 导入数学
def lo_ceil(num, potency=0): # Use 0 for multiples of 1, 1 for multiples of 10, 2 for 100 ...
n = num / (10.0 ** potency)
c = math.ceil(n)
return c * (10.0 ** potency)
lo_ceil(8.0000001, 1) # return 10