2017-02-06 30 views
0

私はPythonには新しく、VBA ExcelからPythonにプログラムを書き直しています。浮動小数点数と小数点の計算

正確な計算が必要ですが、適切な方法を見つけることができません。

例:

aa = 0.000016 

bb = 0.000016 

cc = aa*bb  # which gives 2.5599999999999996e-12 

a = decimal.Decimal('0.0000016') 

b = decimal.Decimal('0.0000016') 

c = a*b   # which gives 2.56E-12 

が、私が行います

ccc= aa*b 

それは私がすべての小数( '')数字と数学を実行するためのいずれかの方法を必要とするエラー

を与えます浮動小数点数をより正確にする(10進数を追加しないで0.0015999996の代わりに0.0016)

+2

ようこそスタックオーバーフロー。私はあなたが[最小、完全で検証可能な例](http://stackoverflow.com/help/mcve)を作成できるように、コードに問題のある部分を編集に含めることをお勧めします。 – roganjosh

+0

「ccc = aa * float(b)」 – Will

+0

を試してください。ありがとうございます。しかし、そうすると、2つの浮動小数点数を乗算した場合と同じ回答が得られます。代わりに、これらの奇妙な小数を最後に追加することなく、数字を正確に保つ方法を見つけ出す必要があります。 – Lidkaaa

答えて

2

floatにTypeErrorをスローするdecimal.Decimalを掛けようとしています。これらを乗算するには、それらのうちの1つをキャストして同じ型であり、結果がどの型であるべきかをPythonが判断できるようにする必要があります。

>>> import decimal 
>>> d = decimal.Decimal("0.000016") # d is a Decimal 
>>> f = 0.000016      # f is a float 
>>> d*f        # can't do this! 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for *: 'Decimal' and 'float' 
>>> float(d) * f      # cast d to a float, get a float result 
2.56e-10 
>>> d * decimal.Decimal(f)   # cast f to Decimal, get a Decimal result 
Decimal('2.559999999999999884155166274E-10') 

:)

+0

ありがとうございました。それは役に立つと私はそのようにもやろうとしています。それは動作しますが、私が実際に必要とするのは、浮動小数点を使用する方法があるかどうかを調べることですが、計算で使用する小数の数を管理します。私がVBAから変換しているプログラムは、非常に小さい数字と非常に大きな数字を使用しています。そして数回反復した後、Pythonは答えの代わりにinfを返します。どのようなことが起こるのかを順を追って調べると、私は浮動小数点数がPythonでは異なっていることに気付き、間もなく私の計算を間違った数に変更しました。 – Lidkaaa

+0

この場合、ソリューションはかなり複雑になる可能性があります。 pythonが浮動小数点で持ついくつかの問題については、2番目の答えを参照してください:http://stackoverflow.com/questions/13479163/round-float-to-x-decimalsあなたが巨大で小さな数字を掛けているときにそうすることを繰り返すと、小さな丸め誤差は、決して回復できない波紋効果をもたらす可能性があります。代わりに 'Decimals'を使用したいかもしれません。 'Decimals'の詳細は2番目の答えを見てください:http://stackoverflow.com/questions/17470883/how-to-round-to-two-decimal-places-in-python-2-7 – Will

+0

ありがとう!これらの投稿は役に立ちましたが、私の計算の次のステップでは混乱しました。私はすべてを小数点まで( '')に変更しようとしましたが、数学関数を使用できないなど別の問題が発生しました。このプログラムには逆行列が含まれています。入力を小数点に変更すると、逆行列にエラーが発生します。 – Lidkaaa