2017-08-31 16 views
0

私はプログラミングのためにPythonを使用しています。次に私の最適化の問題を解決するためにGurobiを使用しています。私のコードの一部として、私はテキストファイル(「Feed2」と呼ばれる)からデータを読み込んで、その上でいくつかの計算を行います。Decimal in Python

with open('Feed2.txt', 'r') as Fee: 

    for i in range(C): 
     Feed= Fee.readline() 
     for s in L11: 
      A[i,s]=float(Feed) 
     for s in L12: 
      A[i,s] =float(Feed)*1.28 
     for s in L13: 
      A[i,s] =float(Feed)*0.95 

print A 

結果は数字のいくつかは私には本当に便利な数字ではありませんこれはすべてのそれらを読み取るためGurobiのための問題をクレート(例えば106.51209999999999または1029.4144000000001など)小数点以下の桁数を持って示しています。だから、プログラム全体の小数点以下5桁の数字を設定したいのですが、私はhttps://docs.python.org/3/library/decimal.htmlで説明されている方法に従っています(コードは以下です)。何も変更されていません。

from decimal import * 

getcontext().prec = 5 
+1

考えます通常の 'float'の数字ではなく、そのパッケージです。また、浮動小数点数がメモリ内でどのように表現されるかは、単なる問題です。これは本当に問題ですか? –

+0

[小数点以下2桁を常に表示するにはどうすればよいでしょうか?](https://stackoverflow.com/questions/1995615/how-can-i-format-a-decimal-to-always-show-小数点以下2桁) –

+0

ありがとうございます。問題はGurobiで最適化の問題を解決するためにこれらの数値を読んでいる間です。これにより、計算時間が増加します。これは、1日以上の精度で近似されます。つまり、ギャップのない最適解に到達します。 – David

答えて

2

decimal moduleのドキュメントは、説明提供:ハードウェアとは異なり

基づいて2進浮動小数点を、小数モジュール(28の場所にデフォルト設定)ユーザ可変精度として大きくすることができる有します特定の問題に対して必要に応じてあなたがやったとき

from decimal import * 
getcontext().prec = 5 

あなただけのdecimalモジュールからDecimalオブジェクトを使用精度に変更します。 Pythonの組み込み浮動小数点数の精度は変更しませんでした。

コメントに記載されているとおり、発生している動作は新しいものではありません。浮動小数点数がメモリに格納される方法の副作用です。特定の精度を維持するために浮動小数点数が本当に必要な場合は、クラスを使用してください。例えば:

>>> from decimal import Decimal 
>>> Decimal.from_float(0.1) 
Decimal('0.1000000000000000055511151231257827021181583404541015625') 
>>> Decimal('0.1') 
Decimal('0.1') 
>>> Decimal('0.1')/Decimal('0.5') 
Decimal('0.2') 

あなたは、単に形式でstr.formatを使用し、適切に表示するためにspecif精度に小数点以下を四捨五入する必要がある場合:

'{:<number of digits before decimal>.<number of digits after decimal >f}'.format(float) 

か、古いスタイルの書式で:

'%<number of digits before decimal>.<number of digits after decimal >f' % (float) 

推奨読書:What Every Computer Scientist Should Know About Floating-Point Arithmetic

0

あなただけ例えば、2つだけ小数、と番号を印刷する必要がある場合:私はdecimal` `の設定のみで作成した番号に影響を与え

print "%.2f" % (A,) 

以降

print "{0:.2f}".format(A)