부동 소수점 값을 인쇄 할 때 과학적 표기법을 억제하는 방법은 무엇입니까?


147

내 코드는 다음과 같습니다.

x = 1.0
y = 100000.0    
print x/y

내 몫은로 표시됩니다 1.00000e-05.

과학적 표기법을 억제하고 다음과 같이 표시하는 방법이 0.00001있습니까? 결과를 문자열로 사용하겠습니다.


1
1/10000 = 0.0001 = 1.00000e-04
Adrian Archer

@AA, 과제 진술서에 오타가 있다고 가정하면 수정했습니다.
Dana

여기에 어떤 대답도 문제를 해결하지 못한다는 것이 실망입니다. 명시 적으로 지정된 경우를 제외하고 python (3)이 과학적 표기법을 전혀 사용하지 못하게하는 방법이 있다면 좋을 것입니다. 모든 대답은 사용자가 과학적 표기법을 명시 적으로 억제해야하며, 이는 일반적으로 파이썬 내에서 과학적 표기법의 암시 적 사용을 억제하는 것과 다릅니다.
BLUC

답변:


64
'%f' % (x/y)

하지만 당신은 정밀함을 스스로 관리해야합니다. 예를 들어

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

0 만 표시합니다.
자세한 내용은 문서에 있습니다

또는 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'

그래도 중요한 수치를 지정하는 동안 어떻게해야합니까?
Marses 2018 년

변수를 사용하여 원하는 자릿수를 지정하고 리터럴 숫자 대신 사용하십시오.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
duality_

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

이것은 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

3

SG의 답변 외에도 Decimal 모듈을 사용할 수도 있습니다.

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")) 답변 :0.00143572


1

이것이 Google의 최고 결과이므로 내 문제에 대한 해결책을 찾지 못하면 여기에 게시 할 것입니다. float 객체의 표시 값을 포맷하고 문자열이 아닌 float로 유지하려는 경우이 솔루션을 사용할 수 있습니다.

float 값이 표시되는 방식을 수정하는 새 클래스를 만듭니다.

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형식 을 사용하므로 형식과 달리 중요하지 않은 0이 추가되지 않습니다 f. n또한 소수점 이하의 정수를 렌더링합니다.

nfloat입력 이 필요 하므로 캐스트.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.