浮動小数点値を印刷するときに科学的表記を抑制する方法は?


147

これが私のコードです:

x = 1.0
y = 100000.0    
print x/y

私の商はと表示され1.00000e-05ます。

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


1
1/10000 = 0.0001 = 1.00000e-04
エイドリアンアーチャー

@AA、それが割り当てステートメントのタイプミスであると想定して、私はそれを修正しました。
Dana、

ここでの答えのどれも質問に対処しないことは残念です。明示的に指定された場合を除いて、python(3)が科学表記法を使用しないようにする方法があれば、すばらしいでしょう。すべての答えは、ユーザーが科学表記法を明示的に抑制することを要求します。これは、Python内からの科学表記法の暗黙的な使用を一般的に抑制することと同じではありません。
BLUC

回答:


64
'%f' % (x/y)

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

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

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

または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'

重要な数値を指定しながらこれを行う方法は?
火曜日

変数を使用して、必要な桁数を与え、リテラル数の代わりにそれを使用すると思います。例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 2018年

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

これは、キュウリ船長の回答を使用していますが、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 2009年

2

それがaの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形式を利用するため、(f形式とは異なり)意味のないゼロは追加されません。nまた、小数なしで既に丸められた整数のレンダリングも処理します。

nfloat入力、つまりキャストが必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.