简单的Python小数处理

2 投票
2 回答
501 浏览
提问于 2025-04-16 20:45

你好,我需要一些帮助。我要计算格式像 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。

撰写回答