2011-08-31 17 views
6

Np.round, np.around ile düzgün bir şekilde yuvarlanmadığı bir sorun yaşıyorum. Ben eksikPython'da Yuvarlama Floatlarıyla İlgili Sorunlar

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 

: ben ne zaman bu değeri manuel olarak belirleyin çünkü dönüş işleri (benim verilerini kullanmak yerine), ama burada çıkışı ben, kod içeremez? A'nın dtype'ı float32, bunu değiştirmem gerekiyor mu?

+4

. hepsini oku [http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf) – JBernardo

+2

Beklenen çıktınız nedir? Belki bir "kesin" değere sahip olmanız gerekiyorsa, python [ondalık] (http://docs.python.org/library/decimal.html) türüne bakın. – jozzas

+0

'np' Numpy ?? –

cevap

5

np.float32(0.01) oluşturmayı deneyin ve cevabınızı göreceksiniz. Sen zaten yapabileceğin hassaslığı elde ediyorsun.

>>> 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

Ne demek istediğini anlıyorum, ama bu sorunu önlemek için değiştirebileceğim farklı bir tip var mı? – mike

+1

evet, örneğin 'np.float64' .. ama" problemi "engellemediğini unutmayın, sadece hatayı daha küçük yapar. – wim

+1

klasik sızdıran soyutlama (http://www.joelonsoftware.com/articles/LeakyAbstractions.html). Yüzenlere hoşgeldiniz. – Simon

0

Not Python en round fonksiyonu ve numpy.float64 tipleri ile ilgili bir sorun var gibi görünüyor. Aşağıdaki örneğe bakın: Bunu düzeltmek

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

tek yol olarak aşağıda yuvarlak fonksiyonunu kullanmadan önce Ģamandıraya numpy.float64 dönüştürmek için geçerli: Burada

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

Bu yöntem işe yaramıyor benim için. Eğer x = 5672.1001' ise, np.round (float (np.float64 (x)), 1) '5672.100000000000004' verir. –