2011-08-31 19 views
6

正しく丸められないnp.round、np.aroundに問題があります。私は私が行うとき、それは手動で値(私のデータを使用するとは対照的に)、リターン作品を設定しているため、コードが含まれるが、ここでは出力されないことができます。Pythonの丸め浮動小数点の問題

In [177]: a 
Out[177]: 0.0099999998 

In [178]: np.round(a,2) 
Out[178]: 0.0099999998 


In [179]: np.round(a,1) 
Out[179]: 0.0 

私は何をしないのですか? aのdtypeはfloat32ですが、これを変更する必要はありますか?

+4

こちら。すべて読む[その](http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf) – JBernardo

+2

あなたの期待される出力は?本当に "正確な"値が必要な場合は、pythonの[decimal](http://docs.python.org/library/decimal.html)タイプを見てください。 – jozzas

+0

'np'はナンシーですか? –

答えて

5

np.float32(0.01)を作成しようとすると、あなたの答えが表示されます。あなたはすでにできる精度を得ています。

>>> import numpy as np 
>>> x = 0.01 
>>> epsilon = 0.01 - np.float32(0.01) 
>>> for n in np.arange(x - 10*epsilon, x + 10*epsilon, epsilon): 
...  print(repr(np.float32(n))) 
...  
0.0099999979 
0.0099999979 
0.0099999979 
0.0099999988 
0.0099999988 
0.0099999988 
0.0099999988 
0.0099999998 
0.0099999998 
0.0099999998 
0.0099999998 
0.0099999998 
0.010000001 
0.010000001 
0.010000001 
0.010000001 
0.010000002 
0.010000002 
0.010000002 
0.010000002 
+0

私はあなたが何を意味するのか見ていますが、この問題を回避するために私はそれを変更することができる別のタイプがありますか? – mike

+1

はい、例えば 'np.float64' ..しかし、それは"問題 "を回避しないことに注意してください。 – wim

+1

古典的な漏れ抽象化(http://www.joelonsoftware.com/articles/LeakyAbstractions.html)。フロートへようこそ。 – Simon

0

注Pythonのround機能とnumpy.float64種類の問題があるようです。私はこの問題を解決できる唯一の方法は、以下のようにラウンド関数を使用する前にフロートにnumpy.float64を変換することです

In [88]: round(np.float64(16.259766999999947), 4) 
Out[88]: 16.259799999999998 

:以下の例を参照してください

In [89]: round(float(np.float64(16.259766999999947)), 4) 
Out[89]: 16.2598 
+0

このメソッドは動作していないようです私のために。 'x = 5672.1001'の場合、' np.round(float(np.float64(x))、1) 'は' 5672.1000000000004'を生成します。 –

関連する問題