有没有办法抑制python中的舍入?

时间:2015-01-23 08:22:45

标签: python decimal rounding

有没有办法抑制python舍入,例如:

>>> getcontext().prec = 11; print (Decimal(1.1237836550999999999)*10**10)
11237836551

我需要显示十进制数的前10位小数,所以实际上我需要11237836550作为输出,我不需要在最后一位数上舍入(在这种情况下,0舍入到1)

有时我可以提高精度(不是在这种情况下)然后安全地执行计算,如下所示:

>>> getcontext().prec = 14; print (Decimal(1.12378365509978)*10**10)
11237836550.998

但是假设您在'0'之后不知道数字的小数部分,例如它可能是1.1237836550999999999999999999999999 ......等等,然后你不能依赖这个“解决方法”。

那么,有没有办法告诉python,“对于这个计算,我不希望执行任何舍入,实际上我想要你只返回所需的小数位数(本例中为10),并且在它之后扔掉任何其他东西“?

我看了Truncating floats in Python,但基本上我需要的不是一个截断浮点字符串,而是用于执行计算的另一个小数。 此外,我链接的帖子中接受的答案的trunc函数在这种情况下不起作用,因为在将它传递给函数的'f'参数之前,十进制将被舍入:

>>> def trunc(f, n):
...     '''Truncates/pads a float f to n decimal places without rounding'''
...     return ('%.*f' % (n + 1, f))[:-1]
... 
>>> trunc(Decimal(1.12378365509978), 10)
'1.1237836551' # and not 1.1237836550 as needed

我该如何实现?

2 个答案:

答案 0 :(得分:7)

您的问题不是Decimal。它是float。即:

>>> 1.1237836550999999999
1.1237836551

如果您这样做,请购买:

>>> int(Decimal("1.1237836550999999999")*10**10)
11237836550

你很高兴。在以更高精度初始化小数时使用字符串。

答案 1 :(得分:2)

这是你找到的:

from decimal import *

getcontext().prec = 103

def precision(context, prec=100):

    return Decimal(context).quantize(Decimal('.'+'0'*(prec-1)+'1'), rounding=ROUND_DOWN)

print precision(Decimal(10).log10() / Decimal(2).log10())

输出:

3.3219280948873623478703194294893901758648313930245806120547563958159347766086252158501397433593701550