我正在寻找一种在Python中打印浮点数的有效方法,其中包含8个字符的最高精度。可以使用%f
或%e
格式,具体取决于数量。您可以省略前导零和尾随零,因此-0.123456
可以写为-.123456
。如果使用科学记数法,您也可以省略“e”,以便-1.234e-8
可以写-1.234-8
。
我基本上是在寻找更快的版本: http://code.google.com/p/pynastran/source/browse/trunk/pyNastran/bdf/fieldWriter.py#80
在分析之后,我发现我的代码花了大约一半的时间在链接例程中,这被称为数十万次。
答案 0 :(得分:0)
它可能有点不同,但使用python3-64使用内置的十进制模块会产生大量小数。
http://docs.python.org/3.3/library/decimal.html#
以下是一个例子:
>>> from decimal import *
>>> getcontext().prec = 20
>>> D = decimal.Decimal
>>> D('1')/D('22')
Decimal('0.045454545454545454545')
>>> getcontext().prec = 40
>>> D('1')/D('22')
Decimal('0.04545454545454545454545454545454545454545')
>>>
PS。作为条款&条件始终适用,请检查顺序操作的注释:http://docs.python.org/3.3/library/decimal.html#mitigating-round-off-error-with-increased-precision
答案 1 :(得分:0)
这是我能想到的最好的。它比我之前使用的功能更具可读性(在我看来),但它并不快。
def print_float_8(val, tol=0.0):
if abs(val) <= tol:
return ' 0.'
if val < 0:
return print_float_neg_8(val)
else:
return print_float_pos_8(val)
def print_float_pos_8(val):
if val < 0.01 or val > 100000:
return print_float_sci_pos_8(val)
if val < 0.1:
f = '%8.6g' % val
else:
f = '%8.7g' % val
if len(f) > 8:
f = f.lstrip('0')
return f
def print_float_sci_pos_8(val):
if val < 1.0e-9:
f = ('%10.3e' % val).replace('e-', '-')
elif val < 1:
f = ('%10.4e' % val).replace('e-0', '-')
elif val <= 1.0e9:
f = ('%10.4e' % val).replace('e+0', '+')
else:
f = ('%10.3e' % val).replace('e+', '+')
return f.strip()
def print_float_neg_8(val):
if val > -0.01 or val < -10000:
return print_float_sci_neg_8(val)
if val > -0.1:
f = '%8.5g' % val
else:
f = '%8.6g' % val
if len(f) > 8:
f = f.replace('-0.', '-.')
return f
def print_float_sci_neg_8(val):
if val > -1.0e-9:
f = ('%-8.2e' % val).replace('e-', '-')
elif val > -1:
f = ('%-8.3e' % val).replace('e-0', '-')
elif val >= -1.0e9:
f = ('%-8.3e' % val).replace('e+0', '+')
else:
f = ('%-8.2e' % val).replace('e+', '+')
return f.strip()