简单的Python小数处理
你好,我需要一些帮助。我要计算格式像 xxxxx.yyyyyyyyyyyyyyy 的浮点数。我了解到应该使用 Decimal 而不是 float。
我尝试了很多,也搜索了很多,但我还是遇到了一个简单的问题:
getcontext().prec = 14
a = Decimal(str('12.737791301'))
b = Decimal(str('12.737791839'))
c = Decimal((b - a)) # substract is what I finally want here
print a, b, c
12.737791301 12.737791839 5.38E-7
我希望 c 显示为 0.000000538。
谢谢你的帮助!
附言:normalize() 没有用。
2 个回答
0
你可以使用 quantize
。大概可以这样做:
c_dec = Decimal(c)
NUMPLACES = Decimal(10)**( c_dec.adjusted() -3)
c_str = str( c_dec.quantize(NUMPLACES) )
print c_str
补充一下。在你具体的例子中,下面的代码可以正常工作:
#!/usr/bin/python
import decimal as dec
a = dec.Decimal(str('12.737791301'))
b = dec.Decimal(str('12.737791839'))
c = dec.Decimal((b - a)) # substract is what I finally want here
print a
print b
sign, digits, exponent=c.as_tuple()
ld=list(digits)
PREC=14
for i in range(0,exponent+PREC+1):
ld.insert(0,0)
cstr="0."
for d in ld:
cstr+=str(d)
print cstr
如果你想要更强大的功能,可以查看这个例子 http://docs.python.org/library/decimal.html#recipes
5
真正的解决办法是使用format(),这个在Python 2.6和3.1版本中都有。
format(c,"f")
可以把小数转换成浮点数的表示方式。这是Python中新格式化的一部分。
下面是一些不太好的解决方案:
你可以用格式字符串来实现,就像你的Decimal值是浮点数一样。print "%0.9f" % c
会输出'0.000000538'。
想了解更多,可以查看Python库的参考文档。
为了避免需要知道小数位数的问题,你可以在打印时使用浮点数的精度限制,并加个条件,以防Decimal值更小:
out = "%.16f" % c if c >= 1e-16 else "0.0"
print out.rstrip('0')
第二行处理了末尾的0。