對於科學應用,我需要輸出非常精確的數字,所以我必須打印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