給定一個小數列,是否有一個很好的方法來查詢近似相等?查詢近似相等
您可以使用範圍:
Purchase.where(total: (value - delta)..(value + delta)).first
但它看起來像一個共同的問題,足以Rails所通常會盡力爲您解決,因爲浮點數不能總是精確表示。
給定一個小數列,是否有一個很好的方法來查詢近似相等?查詢近似相等
您可以使用範圍:
Purchase.where(total: (value - delta)..(value + delta)).first
但它看起來像一個共同的問題,足以Rails所通常會盡力爲您解決,因爲浮點數不能總是精確表示。
我不確定是否有一個gem可以讓你在活動記錄中乾淨地做到這一點,但不是使用範圍,你嘗試過使用SQL舍入嗎?喜歡的東西:
Purchase.where('ROUND(total, 2) = ?', 30.67)
看到這個answer。也鏈接到docs。最後,考慮在this answer之類的數據庫中存儲美分,然後將其更改爲顯示,從而避免處理浮點數。
哎呀!感謝抓住@ndn! – mlabarca
浮動值是邪惡的,並會一直導致偏頭痛。將其強制爲一個整數或使用您的數據庫的原生十進制類型。 – mysmallidea
@mysmallidea,我使用我的*數據庫的原生十進制類型*。 – ndn
我認爲你在問題中做事的方式是最好的方法。如您所知,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
我不會說Ruby特別糟糕。將浮動地圖映射到本地實現的每種語言都會爲您提供994.999 ... – ndn
浮動問題變成爲[不那麼明顯(http://stackoverflow.com /問題/ 40807770 /怪異,倒圓的問題)。 – ndn