2011-12-01 14 views
8

Así que esto funciona bien:pitón Fuerza para no emitirá un flotador en forma estándar/notación científica/forma exponencial

>>> float(1.0e-1) 
0.10000000000000001 

Pero cuando se trata de un número mayor, que no se imprimirá:

>>> float(1.0e-9) 
1.0000000000000001e-09 

¿Hay alguna manera de forzar esto? Tal vez usando numpy o algo así.

+1

posible duplicado de [Imprimir un número flotante en forma normal, no exponencial] (http://stackoverflow.com/questions/7801586/print-a-float-number-in-normal-form-not-exponential) –

Respuesta

15
print '{0:.10f}'.format(1.0e-9) 

String formatting en la documentación.

+0

Doesn ' t trabajo antes de Python 2.6 (que no es un gran problema, pero deberías haberlo mencionado). Más en serio, esto corrige el número de dígitos después del punto decimal, que probablemente no es lo que quiere el OP. – zwol

3

Este es el formato de impresión bastante estándar, específicamente para un flotador:

print "%.9f" % 1.0e-9 
1
>>> a 
1.0000000000000001e-09 
>>> print "heres is a small number %1.9f" %a 
heres is a small number 0.000000001 
>>> print "heres is a small number %1.13f" %a 
heres is a small number 0.0000000010000 
>>> b 
11232310000000.0 
>>> print "heres is a big number %1.9f" %b 
heres is a big number 11232310000000.000000000 
>>> print "heres is a big number %1.1f" %b 
heres is a big number 11232310000000.0 
9

Todo el mundo lo que sugiere el uso del código de formato f cadena está suponiendo implícitamente que está bien para fijar el número de dígitos después del punto decimal. Eso me parece una suposición muy débil. Sin embargo, si no hace esa suposición, no hay un mecanismo incorporado para hacer lo que quiera. Este es el mejor truco que surgió cuando me enfrenté a un problema similar (en un generador de PDF: los números en PDF no pueden usar la notación exponencial). Probablemente desee quitar todos los b de las cuerdas, y puede haber otros Python3-isms aquí.

_ftod_r = re.compile(
    br'^(-?)([0-9]*)(?:\.([0-9]*))?(?:[eE]([+-][0-9]+))?$') 
def ftod(f): 
    """Print a floating-point number in the format expected by PDF: 
    as short as possible, no exponential notation.""" 
    s = bytes(str(f), 'ascii') 
    m = _ftod_r.match(s) 
    if not m: 
     raise RuntimeError("unexpected floating point number format: {!a}" 
          .format(s)) 
    sign = m.group(1) 
    intpart = m.group(2) 
    fractpart = m.group(3) 
    exponent = m.group(4) 
    if ((intpart is None or intpart == b'') and 
     (fractpart is None or fractpart == b'')): 
     raise RuntimeError("unexpected floating point number format: {!a}" 
          .format(s)) 

    # strip leading and trailing zeros 
    if intpart is None: intpart = b'' 
    else: intpart = intpart.lstrip(b'0') 
    if fractpart is None: fractpart = b'' 
    else: fractpart = fractpart.rstrip(b'0') 

    if intpart == b'' and fractpart == b'': 
     # zero or negative zero; negative zero is not useful in PDF 
     # we can ignore the exponent in this case 
     return b'0' 

    # convert exponent to a decimal point shift 
    elif exponent is not None: 
     exponent = int(exponent) 
     exponent += len(intpart) 
     digits = intpart + fractpart 
     if exponent <= 0: 
      return sign + b'.' + b'0'*(-exponent) + digits 
     elif exponent >= len(digits): 
      return sign + digits + b'0'*(exponent - len(digits)) 
     else: 
      return sign + digits[:exponent] + b'.' + digits[exponent:] 

    # no exponent, just reassemble the number 
    elif fractpart == b'': 
     return sign + intpart # no need for trailing dot 
    else: 
     return sign + intpart + b'.' + fractpart 
0

Uso% e al imprimir su número:

>>> a = 0.1234567 
>>> print 'My number is %.7e'%a 
My number 1.2345670e-01 

Si utiliza% g se elegirá automáticamente la mejor visualización para usted:

>>> print 'My number is %.7g'%a 
My number is 0.1234567 
1

Aquí está simplificado respuesta de Zwol y convertido a formato de python estándar:

import re 
def format_float_in_standard_form(f): 
    s = str(f) 
    m = re.fullmatch(r'(-?)(\d)(?:\.(\d+))?e([+-]\d+)', s) 
    if not m: 
     return s 
    sign, intpart, fractpart, exponent = m.groups('') 
    exponent = int(exponent) + 1 
    digits = intpart + fractpart 
    if exponent < 0: 
     return sign + '0.' + '0'*(-exponent) + digits 
    exponent -= len(digits) 
    return sign + digits + '0'*exponent + '.0' 
Cuestiones relacionadas