Как я могу подавить научную запись в Python? - PullRequest
112 голосов
/ 18 марта 2009

Вот мой код:

x = 1.0
y = 100000.0    
print x/y

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

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

Ответы [ 10 ]

57 голосов
/ 19 октября 2015

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

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

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

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

Обновление

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

>>> f'{a:.20f}'
'-0.00000000000000007186'
47 голосов
/ 18 марта 2009
'%f' % (x/y)

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

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

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

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

46 голосов
/ 28 марта 2011

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

'{0:f}'.format(x/y)
4 голосов
/ 19 сентября 2017

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

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

2) добавлена ​​поддержка отрицательных чисел. (в исходной функции отрицательное число будет заканчиваться как 0,0000-108904 от -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
4 голосов
/ 10 августа 2017

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

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
1 голос
/ 24 мая 2019

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

import pandas as pd
pd.options.display.float_format = '{:.2f}'.format
1 голос
/ 06 февраля 2015

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

1 голос
/ 18 марта 2009

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

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

# x is a string '0.0001'
0 голосов
/ 02 июля 2018

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

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

from builtins import float
class FormattedFloat(float):

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

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

0 голосов
/ 14 апреля 2018

При использовании 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]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...