내 코드는 다음과 같습니다.
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)
0 만 표시합니다.
자세한 내용은 문서에 있습니다
또는 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}'
위의 답변의 대부분은 정밀도를 지정해야합니다. 그러나 불필요한 제로없이 다음과 같이 수레를 표시하려면 어떻게해야합니까?
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
이것은 Cucumber 선장의 답변을 사용 하고 있지만 2 가지가 추가되었습니다.
1) 함수가 과학적이지 않은 표기법 숫자를 얻도록 허용하고 그대로 반환하십시오 (따라서 일부 숫자는 0.00003123 대 3.123e-05이며 여전히 기능이 작동합니다.
2) 음수에 대한 지원이 추가되었습니다. (원래 함수에서 음수는 -1.08904e-05에서 0.0000-108904와 같이 끝납니다)
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의 최고 결과이므로 내 문제에 대한 해결책을 찾지 못하면 여기에 게시 할 것입니다. float 객체의 표시 값을 포맷하고 문자열이 아닌 float로 유지하려는 경우이 솔루션을 사용할 수 있습니다.
float 값이 표시되는 방식을 수정하는 새 클래스를 만듭니다.
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
형식 을 사용하므로 형식과 달리 중요하지 않은 0이 추가되지 않습니다 f
. n
또한 소수점 이하의 정수를 렌더링합니다.
n
float
입력 이 필요 하므로 캐스트.