web-dev-qa-db-ja.com

Pythonで科学表記法を抑制するにはどうすればよいですか?

私のコードは次のとおりです。

x = 1.0
y = 100000.0    
print x/y

商が1.00000e-05として表示されます

科学表記法を抑制し、0.00001として表示する方法はありますか?結果を文字列として使用します。

120
Matt
'%f' % (x/y)

しかし、自分で精度を管理する必要があります。例えば。、

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

ゼロのみを表示します。
詳細はドキュメントにあります

またはPython 3の場合 同等の古いフォーマット または 新しいスタイルのフォーマット

50
SilentGhost

新しいバージョン''.formatを使用します(.の後に表示する桁数を忘れずに指定します。これは、浮動小数点数がどれだけ小さいかに依存します)。この例を参照してください。

>>> a = -7.1855143557448603e-17
>>> '{:f}'.format(a)
'-0.000000'

上記のように、デフォルトは6桁です!これはこの例では役に立たないため、代わりに次のようなものを使用できます。

>>> '{:.20f}'.format(a)
'-0.00000000000000007186'

更新

Python 3.6以降では、次のように新しい フォーマットされた文字列リテラル でこれを簡素化できます。

>>> f'{a:.20f}'
'-0.00000000000000007186'
64
Aziz Alto

Python(2.6以降)の新しいバージョンでは、 ''.format() を使用して@SilentGhostが提案したことを実現できます。

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

別のオプションは、pandasを使用していて、すべての浮動小数点数の科学表記法を抑制したい場合、pandasオプションを調整することです。

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

これはどの指数でも機能します:

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

これは Capcu Cucumber's answer を使用していますが、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
4
Finn42

stringである場合、その上に組み込まれているfloatを使用して、たとえば次の変換を実行します。print( "%.5f" % float("1.43572e-03")) answer:0.00143572

1
U-571

SGの答えに加えて、Decimalモジュールも使用できます。

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

# x is a string '0.0001'
1
Dana

これはGoogleでの最高の結果であるため、問題の解決策を見つけられなかった後にここに投稿します。 フロートオブジェクトの表示値をフォーマットし、フロートのままにする場合-文字列ではなく、このソリューションを使用できます:

Float値の表示方法を変更する新しいクラスを作成します。

from builtins import float
class FormattedFloat(float):

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

{:f}の整数値を変更することにより、自分で精度を変更できます

0
Jared Marks

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も、小数部のない既に丸められた整数のレンダリングを処理します。

nfloat入力を必要とするため、キャストが必要です。

0
Alex S

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]))
0
Scott Lohr