Ось мій код:
x = 1.0
y = 100000.0
print x/y
Мій показник відображається як 1.00000e-05
.
Чи є спосіб придушити наукову нотацію і зробити так, щоб вона відображалася як
0.00001
? Я буду використовувати результат як рядок.
Ось мій код:
x = 1.0
y = 100000.0
print x/y
Мій показник відображається як 1.00000e-05
.
Чи є спосіб придушити наукову нотацію і зробити так, щоб вона відображалася як
0.00001
? Я буду використовувати результат як рядок.
Відповіді:
'%f' % (x/y)
але вам потрібно керувати точністю самостійно. наприклад,
'%f' % (1/10**8)
відображатиме лише нулі.
подробиці наведені в документах
Або для Python 3 еквівалентне старе форматування або нове форматування стилів
Використовуючи новішу версію ''.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}"
З новішими версіями Python (2.6 і пізніших версій) ви можете використовувати ''.format()
те, що запропонував @SilentGhost:
'{0:f}'.format(x/y)
>>> print('{:f}'.format(0.000000123))
0.000000
'{0:.10f}'
Інший варіант, якщо ви використовуєте панди і хочете придушити наукові позначення для всіх плавців, - це коригування параметрів панд.
import pandas as pd
pd.options.display.float_format = '{:.2f}'.format
Більшість відповідей вище вимагає уточнити точність. Але що робити, якщо ви хочете відображати плавці так, без зайвих нулів:
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='-')
Це буде працювати для будь-якого показника:
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) дозволяючи функції отримувати нонаукові нотаційні номери та просто повертати їх такими, як є (так що ви можете кинути велику кількість даних про те, що деякі числа є 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
Окрім відповіді SG, ви також можете використовувати модуль Decimal:
from decimal import Decimal
x = str(Decimal(1) / Decimal(10000))
# x is a string '0.0001'
Оскільки це найкращий результат в Google, я опублікую тут, коли не зможу знайти рішення своєї проблеми. Якщо ви хочете відформатувати відображуване значення плаваючого об'єкта і він залишається плаваючою - не рядком, ви можете використовувати це рішення:
Створіть новий клас, який змінює спосіб відображення плаваючих значень.
from builtins import float
class FormattedFloat(float):
def __str__(self):
return "{:.10f}".format(self).rstrip('0')
Ви можете самі змінити точність, змінивши цілі значення в {:f}
Використовуючи 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]))
Станом на 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
введення, таким чином, акторський склад.