source

부동값을 인쇄할 때 과학적 표기법을 사용하지 않는 방법은 무엇입니까?

factcode 2022. 11. 15. 21:32
반응형

부동값을 인쇄할 때 과학적 표기법을 사용하지 않는 방법은 무엇입니까?

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

x = 1.0
y = 100000.0    
print x/y

내 지수는 다음과 같이 표시됩니다.1.00000e-05.

과학적 표기법을 억누르고, 그것을 로 표시할 수 있는 방법은 없을까?0.00001결과를 문자열로 사용합니다.

최신 버전 사용''.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' % (x/y)

스스로 정밀도를 관리해야 합니다.

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

는 0만을 표시합니다.
자세한 내용은 문서에 기재되어 있습니다.

또는 Python 3의 경우 동등한 이전 포맷 또는 새로운 스타일 포맷

Python의 새로운 버전(2.6 이후)에서는 를 사용하여 @SilentGhost가 제안한 것을 실현할 수 있습니다.

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

만약 여러분이 판다를 사용하고 있고 모든 부유물에 대한 과학적 표기법을 금지하고 싶다면, 판다의 옵션을 조정하는 것도 하나의 방법입니다.

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

위의 답변은 대부분 정밀도를 지정해야 합니다.그러나 불필요한 0을 사용하지 않고 다음과 같이 플로트를 표시하려면 어떻게 해야 합니까?

1
0.1
0.01
0.001
0.0001
0.00001
0.000001
0.000000000001

numpy에는 다음과 같은 답이 있습니다.

import numpy as np

def format_float(num):
    return np.format_float_positional(num, trim='-')

numpy 배열의 경우 suppress 명령을 사용하여 다음과 같이 억제할 수 있습니다.

import numpy as np
np.set_printoptions(suppress=True)

이는 모든 지수에 대해 작동합니다.

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

빌트인을 사용할 수 있습니다.format기능.

>>> a = -3.42142141234123e-15
>>> format(a, 'f')
'-0.000000'
>>> format(a, '.50f') # Or you can specify precision
'-0.00000000000000342142141234122994048466990874926279'

이건 오이 선장의 답을 이용한 것이지만, 두 가지 추가가 더해진 것입니다.

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

의 경우string그 후 빌트인 사용float예를 들어 다음과 같이 변환합니다.print( "%.5f" % float("1.43572e-03"))답변:0.00143572

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

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

# x is a string '0.0001'

구글에서 가장 높은 결과가 나왔기 때문에, 저의 고민에 대한 해결책을 찾지 못하고 여기에 글을 올리겠습니다.플로트 객체의 표시 값 형식을 지정하고 문자열이 아닌 플로트 상태로 유지하려는 경우 다음 솔루션을 사용할 수 있습니다.

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

from builtins import float
class FormattedFloat(float):

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

는 본인이 할 수 .{:f}

임의의 유효 자리수로 플로트를 표시하는 보다 간단한 솔루션..numpy이치노

def sig(num, digits=3):
    "Return number formatted for significant digits"
    if num == 0:
        return 0
    negative = '-' if num < 0 else ''
    num = abs(float(num))
    power = math.log(num, 10)
    if num < 1:
        step = int(10**(-int(power) + digits) * num)
        return negative + '0.' + '0' * -int(power) + str(int(step)).rstrip('0')
    elif power < digits - 1:
        return negative + ('{0:.' + str(digits) + 'g}').format(num)
    else:
        return negative + str(int(num))

sig(31415.9) = 3141531400 대신 만약 당신이 원하는 것이 아니라면 얼마든지 코드를 수정하세요.

테스트:

for power in range(-8,8):
    num = math.pi * 10**power
    print(str(num).ljust(25), sig(num))

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력,, 즉즉입다다 다다다다다다.

같은 문제를 안고 있었습니다만, 랜덤으로 솔루션을 사용하고 있었습니다.

from decimal import Decimal

Decimal(2/25500)
#output:0.00007843137254901961000728982664753630160703323781490325927734375

언급URL : https://stackoverflow.com/questions/658763/how-to-suppress-scientific-notation-when-printing-float-values

반응형