Python 如何在不舍入的情况下设置精度?

Python 如何在不舍入的情况下设置精度?,python,Python,我在数据库中有大整数(数字(24,0))。我想把这个数字转换成“人类可读”的格式。我有以下职能: def from_int(value, precision): fprec = "%." + str(precision) + "f" return fprec % (Decimal(value) * (Decimal(10)**(-1*precision))) 它的工作原理是: from_int(1000000, 6) '1.000000' from_int(1000000, 8

我在数据库中有大整数(数字(24,0))。我想把这个数字转换成“人类可读”的格式。我有以下职能:

def from_int(value, precision):
    fprec = "%." + str(precision) + "f"
    return fprec % (Decimal(value) * (Decimal(10)**(-1*precision)))
它的工作原理是:

from_int(1000000, 6)
'1.000000'
from_int(1000000, 8)
'0.01000000'
from_int(1000000, 12)
'0.000001000000'
from_int(1000000, 2)
'10000.00'
但对于:

from_int(19999999999999999, 2)
'200000000000000.00'

如何在不舍入的情况下设置精度?

如果您只需要一个字符串表示,您可能可以通过以下方式解决:

>>> ('%%.%df' % 2) % 2.445
'2.44'
因此,在您的原始代码中:

def from_int(value, precision):
    return ('%%.%df' % precision) % value
编辑:

为了解决精度问题,使用
Decimal
类型和
quantize
方法确实更简单:

>>> d = decimal.Decimal(19999999999999999)
>>> prec = 2
>>> str(d.quantize(decimal.Decimal(10) ** -prec))
'19999999999999999.00'
>>> 
参考:

编辑:使用
Decimal
类型,可以在不舍入的情况下移动小数位数:

>>> str(d * (decimal.Decimal(10) ** -prec))
'199999999999999.99'

使用
%f
格式化将数字转换为浮点,从而失去精度。改为使用
str

def from_int(value, precision):
    return str(Decimal(value) * Decimal(10)**(-precision))

问题出在%f构造中,该构造需要浮点。因此,即使您以十进制计算所有内容,在结尾处也有一个令人讨厌的浮点转换=>因此存在舍入问题。我想你可以写:

def from_int(value, precision):
    return str((Decimal(value) * (Decimal(10)**(-1*precision))))

我用你的值测试了它,结果是正确的。

我认为你用的是
精度
错误。它更多的是一个小数位数,是的,但我想要19999999999999.99,而不是19999999999999。00@Nips:编辑以添加该零件。