Как подавить научную запись при печати значений с плавающей запятой?


147

Вот мой код:

x = 1.0
y = 100000.0    
print x/y

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

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


1
1/10000 = 0,0001 = 1,00000e-04
Адриан Арчер

@AA, предполагая, что это было опечаткой в ​​операторе присваивания, я исправил это.
Дана

Вызывает разочарование, что ни один из ответов здесь не касается вопроса. Было бы неплохо, если бы был какой-либо способ запретить Python (3) вообще использовать научную нотацию, кроме случаев, когда это явно указано. Все ответы требуют, чтобы пользователь явно подавлял научную нотацию, что не то же самое, что вообще подавление неявного использования научной нотации внутри Python.
BLUC

Ответы:


64
'%f' % (x/y)

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

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

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

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


7
Я предлагаю уточнить ваше заявление, чтобы сказать: «Вы сами управляете проявлением точности». Фактическая (внутренняя Python) точность не изменяется, как это часто делается в других языках.
JS.

92

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

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

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

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

Обновить

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

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

Как это сделать, указав при этом значимые цифры?
Марс

Я предполагаю, используя переменную, дайте ей желаемое количество цифр и используйте ее вместо буквального числа, например,f"{a:.{precision}f}"
Азиз Альто

49

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

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

1
Это действительно то, что вы хотите? Я не: >>> print('{:f}'.format(0.000000123)) 0.000000
Duality_

1
@ дуальность, вам может потребоваться указать точность. '{0:.10f}'
nmichaels

24

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

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

10

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

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='-')

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

4

Это использует ответ капитана огурца , но с 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

3

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

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

# x is a string '0.0001'

14
это превращается в научную нотацию для значений, меньших чем 1e-6
SilentGhost

2

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


1

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

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

from builtins import float
class FormattedFloat(float):

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

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


-1

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

-1

Начиная с версии 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ввода, таким образом, актерский состав.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.