2012-02-23 13 views
8

Para una aplicación científica necesito generar números muy precisos, así que tengo que imprimir 15 cifras significativas. Ya hay preguntas sobre este tema aquí, pero todas se refieren a truncar dígitos, no imprimir más.¿Cómo puedo imprimir muchas figuras significativas en Python?

Me di cuenta de que la función print convierte la entrada float en un 10 caracteres string. Además, me di cuenta del módulo decimal, pero eso no satisface mis necesidades.

Entonces la pregunta es, ¿cómo puedo imprimir fácilmente una cantidad variable de figuras significativas de mis carrozas, donde necesito mostrar más de 10?

+0

tener en cuenta que un 'float' no en realidad podría ser capaz de representar los valores que utiliza para la precisión usted requiere, lo que significa que sus cálculos podrían ser terriblemente incorrectos. – geoffspear

+0

@Wooble [This] (http://stackoverflow.com/a/6163157/566644) muy buena respuesta profundiza en la pregunta que estás planteando. Vale la pena echarle un vistazo. –

+0

Pero no hay un tipo de datos más preciso que el float en Python, ¿verdad? – Ingo

Respuesta

12

se puede utilizar el operador de cadena de formato %:

In [3]: val = 1./3 

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

o str.format():

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

En el nuevo código, el último es el estilo preferido, aunque el primero sigue siendo ampliamente utilizado.

Para obtener más información, consulte el documentation.

+6

'print ('{0: .15f}'. Format (val))' es también otra forma de hacerlo en el nuevo formato. – TyrantWave

+3

Tenga en cuenta que esto no imprime 15 dígitos _significant_, pero solo 15 dígitos después del punto decimal. Para números muy grandes o muy pequeños, esto no tiene mucho sentido. En mi humilde opinión, el uso de '"% .15e "' podría ser más razonable. –

3

Utilice estas dos expresiones de impresión comunes para formatear. Es una cuestión de gusto personal sobre cuál es mejor.

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

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

Personalmente, creo que el primero es más compacto y el segundo es más explícito. El formato tiene más funciones cuando se trabaja con múltiples vals.

8

Pensé que la pregunta original quería formatear n cifras significativas, no n puntos decimales. Entonces, ¿podría ser necesaria una función personalizada hasta que se ofrezcan algunos tipos nativos incorporados? por lo que querrá algo como:

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

Se puede utilizar esta función escribí, parece estar funcionando bien y es bastante sencilla:

def nsf(num, n=1): 
    """n-Significant Figures""" 
    numstr = ("{0:.%ie}" % (n-1)).format(num) 
    return float(numstr) 
  1. Primero se convierte el número a una cadena usando notación de exponente
  2. Luego lo devuelve como flotador .

Algunas pruebas:

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

espero que esto le ayuda;)

+0

Hmm, esto sigue escupiendo números en notación de exponente. ¿Quizás porque los convertí para volver a las cadenas más tarde ?, es decir, str (float (...)) – DrMisha