强制Python不以科学记数法输出浮点数
这个代码运行得很好:
>>> float(1.0e-1)
0.10000000000000001
但是当处理更大的数字时,它就不会打印出来了:
>>> float(1.0e-9)
1.0000000000000001e-09
有没有办法强制让它打印出来呢?也许可以用numpy或者其他什么工具。
6 个回答
3
这段内容是关于如何格式化打印输出的,特别是针对小数(浮点数)的标准做法:
print "%.9f" % 1.0e-9
11
大家都在建议使用 f
字符串格式代码,但他们似乎都默认了可以固定小数点后面的位数。我觉得这个假设有点不太靠谱。不过,如果不这样假设的话,Python里没有现成的方法可以做到你想要的效果。当我遇到类似的问题时(在一个PDF生成器中——因为PDF里的数字不能用科学计数法),我想出了这个最好的解决办法。你可能需要把字符串中的所有 b
去掉,里面可能还有其他Python3特有的东西。
_ftod_r = re.compile(
br'^(-?)([0-9]*)(?:\.([0-9]*))?(?:[eE]([+-][0-9]+))?$')
def ftod(f):
"""Print a floating-point number in the format expected by PDF:
as short as possible, no exponential notation."""
s = bytes(str(f), 'ascii')
m = _ftod_r.match(s)
if not m:
raise RuntimeError("unexpected floating point number format: {!a}"
.format(s))
sign = m.group(1)
intpart = m.group(2)
fractpart = m.group(3)
exponent = m.group(4)
if ((intpart is None or intpart == b'') and
(fractpart is None or fractpart == b'')):
raise RuntimeError("unexpected floating point number format: {!a}"
.format(s))
# strip leading and trailing zeros
if intpart is None: intpart = b''
else: intpart = intpart.lstrip(b'0')
if fractpart is None: fractpart = b''
else: fractpart = fractpart.rstrip(b'0')
if intpart == b'' and fractpart == b'':
# zero or negative zero; negative zero is not useful in PDF
# we can ignore the exponent in this case
return b'0'
# convert exponent to a decimal point shift
elif exponent is not None:
exponent = int(exponent)
exponent += len(intpart)
digits = intpart + fractpart
if exponent <= 0:
return sign + b'.' + b'0'*(-exponent) + digits
elif exponent >= len(digits):
return sign + digits + b'0'*(exponent - len(digits))
else:
return sign + digits[:exponent] + b'.' + digits[exponent:]
# no exponent, just reassemble the number
elif fractpart == b'':
return sign + intpart # no need for trailing dot
else:
return sign + intpart + b'.' + fractpart
17
print '{0:.10f}'.format(1.0e-9)
文档中关于字符串格式化的内容。