Force python не выводить float в стандартной форме/научная нотация/экспоненциальная форма

Итак, это прекрасно работает:

>>> float(1.0e-1)
0.10000000000000001

Но при работе с большим числом он не будет печатать:

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

Есть ли способ заставить это? Возможно, используя numpy или что-то в этом роде.

Ответ 2

Все, предлагающие использовать код строки f, неявно предполагают, что можно корректно фиксировать количество цифр после десятичной точки. Это кажется очень шаткой предпосылкой для меня. Однако, если вы не делаете этого предположения, нет встроенного механизма для выполнения того, что вы хотите. Это лучший хак, с которым я столкнулся, столкнувшись с аналогичной проблемой (в PDF-генераторе - цифры в PDF не могут использовать экспоненциальную нотацию). Вероятно, вы хотите удалить все строки b со строк, и здесь могут быть другие Python3-isms.

_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

Ответ 3

Это довольно стандартное форматирование печати, особенно для float:

print "%.9f" % 1.0e-9

Ответ 4

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

Ответ 5

Здесь zwol ответ упрощен и преобразован в стандартный формат python:

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'

Ответ 6

Используйте% e при печати своего номера:

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

Если вы используете% g, он автоматически выбирает лучшую визуализацию для вас:

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