我在数据库中有大整数(数字(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'
如何设置精度而不进行舍入?
答案 0 :(得分:2)
使用%f
格式化将数字转换为浮点丢失精度。而是使用str
:
def from_int(value, precision):
return str(Decimal(value) * Decimal(10)**(-precision))
答案 1 :(得分:1)
问题在于%f结构中需要浮点数。因此,即使你以十进制计算所有内容,你也会在结尾处有一个讨厌的浮动转换=>四舍五入的问题。我想你可以写:
def from_int(value, precision):
return str((Decimal(value) * (Decimal(10)**(-1*precision))))
我根据你的价值测试了它,它给出了正确的结果。
答案 2 :(得分:0)
如果你想要的只是一个字符串表示,你可能会得到这样的东西:
>>> ('%%.%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'
>>>
参考:How can I format a decimal to always show 2 decimal places?
编辑:使用Decimal
类型,您可以移动小数位而不进行舍入:
>>> str(d * (decimal.Decimal(10) ** -prec))
'199999999999999.99'