2016-11-25 105 views
2

給定一個小數列,是否有一個很好的方法來查詢近似相等?查詢近似相等

您可以使用範圍:

Purchase.where(total: (value - delta)..(value + delta)).first 

但它看起來像一個共同的問題,足以Rails所通常會盡力爲您解決,因爲浮點數不能總是精確表示。

+0

浮動問題變成爲[不那麼明顯(http://stackoverflow.com /問題/ 40807770 /怪異,倒圓的問題)。 – ndn

回答

1

我不確定是否有一個gem可以讓你在活動記錄中乾淨地做到這一點,但不是使用範圍,你嘗試過使用SQL舍入嗎?喜歡的東西:

Purchase.where('ROUND(total, 2) = ?', 30.67) 

看到這個answer。也鏈接到docs。最後,考慮在this answer之類的數據庫中存儲美分,然後將其更改爲顯示,從而避免處理浮點數。

+0

哎呀!感謝抓住@ndn! – mlabarca

+0

浮動值是邪惡的,並會一直導致偏頭痛。將其強制爲一個整數或使用您的數據庫的原生十進制類型。 – mysmallidea

+0

@mysmallidea,我使用我的*數據庫的原生十進制類型*。 – ndn

1

我認爲你在問題中做事的方式是最好的方法。如您所知,Ruby在處理浮點值方面表現出色(嘗試9.95 * 100)。只要您將數據庫中的值存儲爲十進制值,而不是浮點數,則應該可以。

我能想到的,提高的唯一的事情就是把它解壓到一個類的方法,是這樣的:

# models/purchase.rb 
def self.find_approximate(value, delta=0.1) 
    where(total: (value - delta)..(value + delta)) 
end 

Purchase.find_approximate(9.95).first 
+1

我不會說Ruby特別糟糕。將浮動地圖映射到本地實現的每種語言都會爲您提供994.999 ... – ndn