Python 如何在不舍入的情况下设置精度?
我在数据库中有大整数(数字(24,0))。我想把这个数字转换成“人类可读”的格式。我有以下职能: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
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:编辑以添加该零件。