2013-02-01 70 views
0

我有一個系統,它的運行了一堆計算的,由於某種原因,每次0.07顯示了它看起來0.07000000000000001紅寶石浮法問題

我很清楚地知道,花車是近似的,但我在寫代碼例如:

​​

儘管如此,0.07000000000000001一直顯示在我的代碼並最終導致數組排序失敗:

sort! { |a,b| b <=> a }  <-- b equals 0.07000000000000001 and a equals 0.08 

它會引發錯誤說它不能比較這兩個數字。有關如何解決這個問題的任何想法?

更新

所以看起來好像原值爲0.07351923338974675在這一點我稱之爲.round(2)。然後我暫時將它存儲在Redis中,然後再將它拉出來。當它進行計算時,它最終顯示爲0.07000000000000001。這聽起來像整數比較可能是最好的,除非有其他解決方案。

+1

可以比較整數和浮點數。其中一個必須是別的。你也應該顯示'num1 - num2'是什麼。 – sawa

+2

正在提出的錯誤是什麼?如果這些值真的是你所說的,那麼我看不到他們爲什麼不可以比較的任何理由,即使漂移在0.07以內。另外,正如@Cthulhu所說,'round()'可能是更好的方法來消除浮點漂移。 – mdunsmuir

+0

這將花費我10分鐘左右來測試...會有更新。嘗試。圓(2)第一 –

回答

2

所有的數字都是有序的,但是String不能對數字進行有序比較,只能進行相等比較來查看它們是否是同一個對象。 (顯然總是會返回false的比較。)

我想這是您看到的錯誤類型,如:ArgumentError:String與Float的比較失敗

浮點對象中低位的問題可能會干擾您的排序,但引發實際異常似乎不太可能。像大多數十進制字符串分數一樣,0.07在底層Float格式中沒有確切的表示形式。可以想象得到0.07(文字常數與計算結果)的不同方式可能導致每一個稍微不同的值。

但是請注意,如果您試圖打印出比數量更多的小數位數,您會看到最後一些位的剩餘部分。這些數字可以不爲零,但它們不會告訴您任何有關您的號碼的有用信息。

要做的最安全的事情是縮放到整數值,請致電#to_i,並比較整數。

+0

我認爲你釘了它... .0700000000001被轉換成一個字符串。你知道爲什麼會這樣嗎? –

+0

事實上,sawa和mdunsmuir在一個小時前就已經釘了它。如果您已經提供了實際的錯誤消息,那麼它可能會立即顯而易見。 –

+0

我不能得到錯誤,因爲Sidekiq沒有報告:(它只提供以下內容:{「retry」=> false,「queue」=>「default」,「class」=>「LeaderboardMonitor」,「 args「=> [],」jid「=>」ff70ecfc6a0437bd6f3a84f8「} 2013-02-01T23:05:15 + 00:00 app [worker.1]:2013-02-01T23:05:15Z 2 TID-1h2weo WARN:LeaderboardEntry和LeaderboardEntry的比較失敗 2013-02-01T23:05:15 + 00:00 app [worker。1]:2013-02-01T23:05:15Z 2 TID-1h2weo WARN:/app/app/models/leaderboard_data.rb:51:in'sort!' 2013-02-01T23:05:15 + 00:00 app [worker.1]:/app/app/models/leaderboard_data.rb:51:in'sort_by' –