2011-08-31 35 views
6

Tôi gặp sự cố với np.round, np.around nơi nó không làm tròn đúng cách. Tôi không thể bao gồm mã, bởi vì khi tôi làm điều đó bằng tay thiết lập giá trị (như trái ngược với sử dụng dữ liệu của tôi), những tác phẩm trở lại, nhưng đây là kết quả:Các vấn đề với Làm tròn nổi trong 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 

tôi thiếu gì? Các dtype của một là float32, tôi cần phải thay đổi điều này?

+4

đây. đọc tất cả [rằng] (http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf) – JBernardo

+2

Sản lượng mong đợi của bạn là gì? Có thể có một cái nhìn về [thập phân] của python (http://docs.python.org/library/decimal.html) nếu bạn thực sự phải có một giá trị "chính xác". – jozzas

+0

'np' là Numpy ?? –

Trả lời

5

Hãy thử tạo np.float32(0.01) và bạn sẽ thấy câu trả lời của mình. Bạn đang nhận được độ chính xác mà bạn đã có.

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

Tôi hiểu ý của bạn là gì, nhưng có một loại khác nào tôi có thể thay đổi nó thành để ngăn chặn vấn đề này không? – mike

+1

có, ví dụ 'np.float64' .. nhưng lưu ý rằng nó không ngăn chặn" vấn đề ", nó chỉ làm cho lỗi nhỏ hơn. – wim

+1

trừu tượng bị rò rỉ cổ điển (http://www.joelonsoftware.com/articles/LeakyAbstractions.html). Chào mừng bạn đến với phao nổi. – Simon

0

Note có vẻ là một vấn đề với chức năng round python và numpy.float64 loại. Xem ví dụ dưới đây:

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

Cách duy nhất tôi có thể sửa lỗi này là để chuyển đổi numpy.float64 đến một phao trước khi sử dụng chức năng tròn như dưới đây:

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

Phương pháp này dường như không hoạt động cho tôi. Nếu 'x = 5672.1001', thì' np.round (float (np.float64 (x)), 1) 'sản lượng' 5672.1000000000004'. –

Các vấn đề liên quan