2012-02-23 12 views
8

Do aplikacji naukowej muszę wyprowadzać bardzo dokładne liczby, więc muszę wydrukować 15 znaczących cyfr. Istnieją już pytania na ten temat, ale wszystkie dotyczą skracania cyfr, a nie drukowania więcej.Jak mogę wydrukować wiele znaczących cyfr w Pythonie?

Uświadomiłem sobie, że funkcja print konwertuje dane wejściowe float na 10 znaków string. Ponadto, zdałem sobie sprawę z modułu decimal, ale to nie odpowiada moim potrzebom.

Pytanie brzmi: w jaki sposób mogę łatwo wydrukować zmienną ilość znaczących liczb z moich ujęć, w których muszę wyświetlić więcej niż 10?

+0

pamiętać, że 'float' nie może rzeczywiście być w stanie reprezentować wartości używasz do precyzji potrzebujesz, co oznacza, że ​​twoje obliczenia mogą okazać się bardzo złe. – geoffspear

+0

@Wooble [This] (http://stackoverflow.com/a/6163157/566644) bardzo ładna odpowiedź zagłębia się w pytanie, które podnosisz. Warto spojrzeć. –

+0

Ale nie ma bardziej precyzyjnego typu danych niż float w Pythonie, prawda? – Ingo

Odpowiedz

12

Można użyć operatora ciąg formatowania %:

In [3]: val = 1./3 

In [4]: print('%.15f' % val) 
0.333333333333333 

lub str.format():

In [8]: print(str.format('{0:.15f}', val)) 
Out[8]: '0.333333333333333' 

W nowym kodem, ten ostatni jest preferowany styl, chociaż były nadal powszechnie stosowane. Aby uzyskać więcej informacji, zobacz

.

+6

'print ('{0: .inf}'. Format (val))' to także inny sposób na zrobienie tego w nowym formacie. – TyrantWave

+3

Należy zauważyć, że nie zostanie wydrukowanych 15 znaczących cyfr, a jedynie 15 cyfr po przecinku dziesiętnym. W przypadku bardzo dużych lub bardzo małych liczb nie ma to większego sensu. IMHO, używając '" .15e "' może być bardziej uzasadnione. –

3

Użyj tych dwóch popularnych idiomów drukowania, aby sformatować. To kwestia osobistego gustu, który jest lepszy.

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

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

Osobiście uważam, że pierwszy jest bardziej kompaktowy, a drugi bardziej wyraźny. Format ma więcej funkcji podczas pracy z wieloma zmiennymi.

8

Pomyślałem, że oryginalne pytanie miało formatować n cyfr znaczących, a nie n liczb dziesiętnych. Więc niestandardowa funkcja może być wymagana, dopóki nie pojawi się więcej rodzimych wbudowanych typów? Więc chcesz coś takiego:

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

można użyć tej funkcji napisałem, wydaje się, że działa poprawnie i to całkiem prosty:

def nsf(num, n=1): 
    """n-Significant Figures""" 
    numstr = ("{0:.%ie}" % (n-1)).format(num) 
    return float(numstr) 
  1. It najpierw konwertuje numer do ciągu znaków przy użyciu notacji wykładniczej
  2. Następnie zwraca go jako float .

Niektóre testy:

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

Mam nadzieję, że to pomaga;)

+0

Hmm, to ciągle wypluwa liczby w notacji potęgowej. Być może dlatego, że później przekonwertowałem je z powrotem na łańcuchy, np. Str (float (...)) – DrMisha

Powiązane problemy