对于科学应用,我需要输出非常精确的数字,所以我必须打印15位有效数字。这里已经有关于这个话题的问题,但是他们都在关注截取的数字,而不是打印更多。如何在Python中打印许多有效数字?
我意识到print
函数将输入float
转换为10个字符string
。此外,我开始意识到decimal
模块,但这不符合我的需求。
所以问题是,我怎样才能轻松地打印出浮动数字的显着数字,我需要显示10个以上的数字?
对于科学应用,我需要输出非常精确的数字,所以我必须打印15位有效数字。这里已经有关于这个话题的问题,但是他们都在关注截取的数字,而不是打印更多。如何在Python中打印许多有效数字?
我意识到print
函数将输入float
转换为10个字符string
。此外,我开始意识到decimal
模块,但这不符合我的需求。
所以问题是,我怎样才能轻松地打印出浮动数字的显着数字,我需要显示10个以上的数字?
你可以使用字符串格式化操作%
:
In [3]: val = 1./3
In [4]: print('%.15f' % val)
0.333333333333333
或str.format()
:
In [8]: print(str.format('{0:.15f}', val))
Out[8]: '0.333333333333333'
在新的代码,后者是首选的风格,但前者仍然被广泛使用。
欲了解更多信息,请参阅documentation。
'print('{0:.15f}'.format(val))'也是以新格式进行操作的另一种方法。 – TyrantWave 2012-02-23 16:07:45
请注意,这不会打印15个_significant_ digits,而只是15个小数点后的数字。对于非常大或非常小的数字,这没有多大意义。恕我直言,使用'“%.15e”'可能更合理。 – 2016-07-01 09:18:13
使用这两种常见的打印习惯用于格式化。它是个人品味更好的问题。
value = 10/3 #gives a float of 3.33333.....
print '%.15f' % value
print str.format('{0:.15f}', value)
我个人认为第一个更紧凑,第二个更明确。使用多个val时格式具有更多功能。
认为原始问题想格式化n个有效数字,而不是n个小数点。所以可能需要一个自定义函数,直到提供更多的本地内置类型为止? 所以你想要的东西,如:
def float_nsf(q,n):
"""
Truncate a float to n significant figures. May produce overflow in
very last decimal place when q < 1. This can be removed by an extra
formatted print.
Arguments:
q : a float
n : desired number of significant figures
Returns:
Float with only n s.f. and trailing zeros, but with a possible small overflow.
"""
sgn=npy.sign(q)
q=abs(q)
n=int(npy.log10(q/10.)) # Here you overwrite input n!
if q<1. :
val=q/(10**(n-1))
else:
val=q/(10**n)
return sgn*int(val)*10.**n
你可以使用这个功能我写的,它似乎是工作的罚款,这是相当简单:
def nsf(num, n=1):
"""n-Significant Figures"""
numstr = ("{0:.%ie}" % (n-1)).format(num)
return float(numstr)
一些测试:
>>> a = 2./3
>>> b = 1./3
>>> c = 3141592
>>> print(nsf(a))
0.7
>>> print(nsf(a, 3))
0.667
>>> print(nsf(-a, 3))
-0.667
>>> print(nsf(b, 4))
0.3333
>>> print(nsf(-b, 2))
-0.33
>>> print(nsf(c, 5))
3141600.0
>>> print(nsf(-c, 6))
-3141590.0
我希望这可以帮助你;)
嗯,这不断吐出数字的指数符号。也许是因为我稍后将它们转换回字符串,即str(float(...)) – DrMisha 2015-04-28 16:35:56
记住了'float'实际可能不能够代表你正在使用的精度值你需要,这意味着你的计算很可能是非常错误的。 – geoffspear 2012-02-23 15:46:49
@Wooble [This](http://stackoverflow.com/a/6163157/566644)非常好的答案深入到你正在提出的问题。值得一看。 – 2012-02-23 16:02:55
但是没有比Python中float更精确的数据类型,是吗? – Ingo 2012-02-24 10:55:56