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

Вот мой код:

x = 1.0
y = 100000.0    
print x/y

Мой коэффициент отображается как 1.00000e-05

Есть ли способ подавить научную запись и заставить ее отображать 0.00001? Я собираюсь использовать результат в виде строки.

Ответ 2

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

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

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

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

Update

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

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

Ответ 3

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

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

Ответ 4

Другой вариант, если вы используете панд и хотите отключить научное обозначение для всех поплавков, это настроить параметры панд.

import pandas as pd
pd.options.display.float_format = '{:.2f}'.format

Ответ 5

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

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

Ответ 6

Это использует ответ Captain Cucumber, но с двумя дополнениями.

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

2) добавлена поддержка отрицательных чисел. (в исходной функции отрицательное число будет заканчиваться как 0,0000 -1 08904 из -1.08904e-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

Ответ 7

Кроме ответа SG, вы также можете использовать модуль Decimal:

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

# x is a string '0.0001'

Ответ 8

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

Ответ 9

Используя 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]))

Ответ 10

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

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

from builtins import float
class FormattedFloat(float):

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

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

Ответ 11

Начиная с версии 3.6 (возможно, также работает с более старыми версиями 3.x), это мое решение:

import locale
locale.setlocale(locale.LC_ALL, '')

def number_format(n, dec_precision=4):
    precision = len(str(round(n))) + dec_precision
    return format(float(n), f'.{precision}n')

Цель вычисления precision состоит в том, чтобы гарантировать, что у нас достаточно точности, чтобы не попадать в научную нотацию (точность по умолчанию все еще равна 6).

Аргумент dec_precision добавляет дополнительную точность для использования для десятичных точек. Поскольку для этого используется формат n, незначительные нули не будут добавлены (в отличие от форматов f). n также позаботится о рендеринге уже круглых целых чисел без десятичной дроби.

n требует float ввода, таким образом, приведение.

Ответ 12

Большинство ответов выше требуют указания точности. Но что, если вы хотите отображать числа с плавающей точкой, как это, без лишних нулей:

1
0.1
0.01
0.001
0.0001
0.00001
0.000001
0.000000000001

numpy имеет ответ: np.format_float_positional

import numpy as np

def format_float(num):
    return np.format_float_positional(num, trim='-')