如何设置精度而不进行舍入?

时间:2014-06-02 12:30:14

标签: 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)
'0.01000000'
from_int(1000000, 12)
'0.000001000000'
from_int(1000000, 2)
'10000.00'

但是:

from_int(19999999999999999, 2)
'200000000000000.00'

如何设置精度而不进行舍入?

3 个答案:

答案 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'