2012-02-23 54 views
8

對於科學應用,我需要輸出非常精確的數字,所以我必須打印15位有效數字。這裏已經有關於這個話題的問題,但是他們都在關注截取的數字,而不是打印更多如何在Python中打印許多有效數字?

我意識到print函數將輸入float轉換爲10個字符string。此外,我開始意識到decimal模塊,但這不符合我的需求。

所以問題是,我怎樣才能輕鬆地打印出浮動數字的顯着數字,我需要顯示10個以上的數字?

+0

記住了'float'實際可能不能夠代表你正在使用的精度值你需要,這意味着你的計算很可能是非常錯誤的。 – geoffspear 2012-02-23 15:46:49

+0

@Wooble [This](http://stackoverflow.com/a/6163157/566644)非常好的答案深入到你正在提出的問題。值得一看。 – 2012-02-23 16:02:55

+0

但是沒有比Python中float更精確的數據類型,是嗎? – Ingo 2012-02-24 10:55:56

回答

12

你可以使用字符串格式化操作%

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

+6

'print('{0:.15f}'.format(val))'也是以新格式進行操作的另一種方法。 – TyrantWave 2012-02-23 16:07:45

+3

請注意,這不會打印15個_significant_ digits,而只是15個小數點後的數字。對於非常大或非常小的數字,這沒有多大意義。恕我直言,使用'「%.15e」'可能更合理。 – 2016-07-01 09:18:13

3

使用這兩種常見的打印習慣用於格式化。它是個人品味更好的問題。

value = 10/3   #gives a float of 3.33333..... 

print '%.15f' % value 
print str.format('{0:.15f}', value) 

我個人認爲第一個更緊湊,第二個更明確。使用多個val時格式具有更多功能。

8

認爲原始問題想格式化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 
1

你可以使用這個功能我寫的,它似乎是工作的罰款,這是相當簡單

def nsf(num, n=1): 
    """n-Significant Figures""" 
    numstr = ("{0:.%ie}" % (n-1)).format(num) 
    return float(numstr) 
  1. 它首先將使用指數表示法
  2. 然後將其返回爲float

一些測試:

>>> 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 

我希望這可以幫助你;)

+0

嗯,這不斷吐出數字的指數符號。也許是因爲我稍後將它們轉換回字符串,即str(float(...)) – DrMisha 2015-04-28 16:35:56

相關問題