2017-01-24 13 views
0

通常の型を使用するときに浮動小数点エラーを持つPythonを認識しています。だから私はパンダを代わりに使っているのです。Pandas [Python]で浮動小数点エラーを持つFloat64フィールド

私は突然データI入力(ない計算)でいくつかの問題を持って、次の行動を説明することはできません開始しました:

In [600]: df = pd.DataFrame([[0.05], [0.05], [0.05], [0.05]], columns = ['a']) 

In [601]: df.dtypes 
Out[601]: 
a float64 
dtype: object 

In [602]: df['a'].sum() 
Out[602]: 0.20000000000000001 

In [603]: df['a'].round(2).sum() 
Out[603]: 0.20000000000000001 

In [604]: (df['a'] * 1000000).round(0).sum() 
Out[604]: 200000.0 

In [605]: (df['a'] * 1000000).round(0).sum()/1000000 
Out[605]: 0.20000000000000001 

うまくいけば、誰かがどちらか私を助けてこの問題を解決するか、正しく0.2(またはを合計する方法を見つけ出すことができます私は結果が20か2000かどうかは気にしませんが、私が分け合ったときにわかるように、私は合計が間違っている同じポイントになります!)。

import pandas as pdを行うことを覚えている私のコードを実行するために)

+2

これは浮動小数点数の性質です。それは単なる表現なので、無視することができます。なぜそれはあなたのために問題ですか? BTWはこれを試してみましょう: 'print(0.1 + 0.2)' – MaxU

+0

@MaxU私はそれを得ます。それはなぜ私が0.05 * 100 = 5を行うことで解決しようとするのでしょうか、それらを合計して20を得るのです。しかし、私の問題は、システムが20.00000..001を見て、丸めさえトリックをしないように見えることです。 – Yona

+0

[浮動小数点数学は壊れていますか?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken) –

答えて

0

[OK]をので、これは動作します:

In [642]: (((df * 1000000).round(0))/1000000).sum() 
Out[642]: 
a 0.2 
dtype: float64 

をしかし、これはしていません:

In [643]: (((df * 1000000).round(0))).sum() * 1000000 
Out[643]: 
a 2.000000e+11 
dtype: float64 

ですから、すべての計算をしなければなりませんパンダアレイの内側に置くか、物を壊す危険があります。

0

「合計が正しくない点が同じです!」誤った定義では、ほとんどすべての浮動小数点演算が不正確になります。 2のべき乗は浮動小数点で完全に表現され、それ以外のものは(倍精度浮動小数点数の場合)約15-17桁の丸め誤差があります。アプリケーションによっては、これらの値を表示するときにこのエラーを他のアプリケーションよりも隠すことがあります。 使用しているデータの精度は、これ以上十分です。

醜い出力に悩まされている場合は、"{:.1f}".format(value)を実行して、出力文字列をポイントの後の10進数の1桁に丸めるか、"{:g}".format(value)を表示して適切な桁数を自動的に選択して表示します。

+0

「2の累乗だけ」は少し控えめです。通常のIEEE 754バイナリ64浮動小数点形式で正確に表現できる約180億の実数。そのうち180億のうち2098だけが2の勢力です。 –

関連する問題