Як придушити наукові позначення при друкуванні плаваючих значень?


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}"
Aziz Alto

49

З новішими версіями Python (2.6 і пізніших версій) ви можете використовувати ''.format()те, що запропонував @SilentGhost:

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

1
Це справді те, чого ти хочеш? Я не >>> print('{:f}'.format(0.000000123)) 0.000000
знаю

1
@duality, можливо, вам потрібно буде вказати точність. '{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

Для цього використовується відповідь капітана Огірка , але з двома доповненнями.

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, ви також можете використовувати модуль Decimal:

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

# x is a string '0.0001'

14
це переходить до наукових позначень значень менших за 1е-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.