私のコードは次のとおりです。
x = 1.0
y = 100000.0
print x/y
商が1.00000e-05
として表示されます
科学表記法を抑制し、0.00001
として表示する方法はありますか?結果を文字列として使用します。
'%f' % (x/y)
しかし、自分で精度を管理する必要があります。例えば。、
'%f' % (1/10**8)
ゼロのみを表示します。
詳細はドキュメントにあります
または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'
Python(2.6以降)の新しいバージョンでは、 ''.format()
を使用して@SilentGhostが提案したことを実現できます。
'{0:f}'.format(x/y)
別のオプションは、pandasを使用していて、すべての浮動小数点数の科学表記法を抑制したい場合、pandasオプションを調整することです。
import pandas as pd
pd.options.display.float_format = '{:.2f}'.format
これはどの指数でも機能します:
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
これは 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
string
である場合、その上に組み込まれているfloat
を使用して、たとえば次の変換を実行します。print( "%.5f" % float("1.43572e-03"))
answer:0.00143572
SGの答えに加えて、Decimalモジュールも使用できます。
from decimal import Decimal
x = str(Decimal(1) / Decimal(10000))
# x is a string '0.0001'
これはGoogleでの最高の結果であるため、問題の解決策を見つけられなかった後にここに投稿します。 フロートオブジェクトの表示値をフォーマットし、フロートのままにする場合-文字列ではなく、このソリューションを使用できます:
Float値の表示方法を変更する新しいクラスを作成します。
from builtins import float
class FormattedFloat(float):
def __str__(self):
return "{:.10f}".format(self).rstrip('0')
{:f}
の整数値を変更することにより、自分で精度を変更できます
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
も、小数部のない既に丸められた整数のレンダリングを処理します。
n
はfloat
入力を必要とするため、キャストが必要です。
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]))