Как подавить научную нотацию в Python?



вот мой код:



x = 1.0
y = 100000.0
print x/y


мой фактор отображается как 1.00000e-05



есть ли способ подавить научную нотацию и заставить ее отображаться как
0.00001? Как преобразовать научную нотацию в float.



спасибо заранее.

Это кажется несколько нелепым, чтобы спросить, но я не понял
а способа сделать это пока нет. Я собираюсь использовать результат в виде строки.

576   9  

9 ответов:

'%f' % (x/y)

но вы должны управлять точностью самостоятельно. например,

'%f' % (1/10**8)

отображаются только нули.
подробности в документации

или для Python 3 эквивалентное старое форматирование или новое форматирование стиля

С более новыми версиями Python (2.6 и более поздних), вы можете использовать ''.format() чтобы выполнить то, что предложил @SilentGhost:

'{0:f}'.format(x/y)

использование более новой версии ''.format (также не забудьте указать, сколько цифр после . вы хотите отобразить, это зависит от того, насколько мало плавающее число). См. этот пример:

>>> a = -7.1855143557448603e-17
>>> '{:f}'.format(a)
'-0.000000'

как показано выше, по умолчанию-6 цифр! Это не полезно для нашего примера случая, поэтому вместо этого мы могли бы использовать что-то вроде этого:

>>> '{:.20f}'.format(a)
'-0.00000000000000007186'

обновление

начиная с Python 3.6, это можно упростить с помощью нового форматированную строку литерал следующим образом:

>>> f'{a:.20f}'
'-0.00000000000000007186'

Это будет работать для любого показателя:

def getExpandedScientificNotation(flt):
    str_vals = str(flt).split('e')
    coef = float(str_vals[0])
    exp = int(str_vals[1])
    return_val = ''
    if int(exp) > 0:
        return_val += str(coef).replace('.', '')
        return_val += ''.join(['0' for _ in range(0, abs(exp - len(str(coef).split('.')[1])))])
    elif int(exp) < 0:
        return_val += '0.'
        return_val += ''.join(['0' for _ in range(0, abs(exp) - 1)])
        return_val += str(coef).replace('.', '')
    return return_val

это с помощью ответ капитана огурца, но с 2 дополнениями.

1) позволяя функции получать номера ненаучных обозначений и просто возвращать их как есть (так что вы можете бросить много входных данных, что некоторые из чисел 0.00003123 vs 3.123 e-05 и все еще имеют работу функции.

2) Добавлена поддержка отрицательных чисел. (в оригинальной функции, отрицательное число будет в конечном итоге, как 0.0000-108904 от -1.08904 e-05)

def getExpandedScientificNotation(flt):
    was_neg = False
    if not ("e" in flt):
        return flt
    if flt.startswith('-'):
        flt = flt[1:]
        was_neg = True 
    str_vals = str(flt).split('e')
    coef = float(str_vals[0])
    exp = int(str_vals[1])
    return_val = ''
    if int(exp) > 0:
        return_val += str(coef).replace('.', '')
        return_val += ''.join(['0' for _ in range(0, abs(exp - len(str(coef).split('.')[1])))])
    elif int(exp) < 0:
        return_val += '0.'
        return_val += ''.join(['0' for _ in range(0, abs(exp) - 1)])
        return_val += str(coef).replace('.', '')
    if was_neg:
        return_val='-'+return_val
    return return_val

в дополнение к ответу SG, вы также можете использовать десятичный модуль:

from decimal import Decimal
x = str(Decimal(1) / Decimal(10000))

# x is a string '0.0001'

если это string затем используйте встроенный float на то, чтобы сделать преобразование, например: print( "%.5f" % float("1.43572e-03")) ответ:0.00143572

используя 3.6.4, у меня была аналогичная проблема, что случайно число в выходном файле будет отформатировано с научной нотацией при использовании этого:

fout.write('someFloats: {0:0.8},{1:0.8},{2:0.8}'.format(someFloat[0], someFloat[1], someFloat[2]))

все, что мне нужно было сделать, чтобы исправить это было добавить 'f':

fout.write('someFloats: {0:0.8f},{1:0.8f},{2:0.8f}'.format(someFloat[0], someFloat[1], someFloat[2]))

Так как это лучший результат на Google, я буду публиковать здесь после того, как не удалось найти решение для моей проблемы. Если вы хотите отформатировать отображаемое значение объекта float и оставить его float - не строкой, вы можете использовать это решение:

создайте новый класс, который изменяет способ отображения значений с плавающей запятой.

from builtins import float
class FormattedFloat(float):

    def __str__(self):
        return "{:.10f}".format(self).rstrip('0')

вы можете изменить точность самостоятельно, изменив целочисленные значения в {:f}

Comments

    Ничего не найдено.