2011-06-14 57 views
1

因此,我使用Ruby On Rails創建了一個時間跟蹤應用程序,並將時間存儲爲表示小時的數字。在Ruby on Rails中處理定點/精確十進制的最佳方法

因爲任何超過0.01(36秒)的小時都不相關,所以我只需要2個小數位。

我正在使用一個MySQL數據庫與一個浮點數作爲列類型。雖然這在大多數情況下都是有效的,但我偶爾會發現計算和舍入浮點數的錯誤。

我對我的選項做了一些研究,看到很多人推薦使用BigDecimal。由於我使用大量自定義數據庫查詢使用計算,所以我想知道如何更改列類型會影響這一點。它是以字符串還是yaml存儲,還是由MySQL本機支持?

還是有一種等同的方式來做Ruby/Rails中的定點十進制算術。

我認爲任何方法都需要大量的重構,我怎麼能避免這個最重要?

任何洞察力是讚賞。

回答

2

MySQL確實有內置的BigDecimal支持。 http://dev.mysql.com/doc/refman/5.1/en/precision-math-decimal-changes.html

我會建議使用它;它適用於我的Rails應用程序。允許數據庫處理它而不是應用程序會使生活更輕鬆 - 您正按照設計的方式使用抽象。

這裏的遷移代碼:

change_column :table_name, :column_name, :decimal 

參考:Rails migration for change column

+0

+',:precision => 5,:scale => 2'到更改列 – loosecannon 2011-06-14 16:17:12

+0

這幾乎可以無縫地工作,我不得不改變應用程序代碼。 – loosecannon 2011-06-14 21:49:09

3

不是將時間存儲爲表示小時的數字,而是將其存儲爲表示增量爲36秒(或可能是個別秒)的數字。

你不應該需要一個小數支持類型來做定點,只需在業務邏輯中劃分以獲得小時。

1

我們有實際建造時間跟蹤應用程序(http://www.yanomo.com)和我們所有的時間存儲,因爲它們與MySQL表示爲小時數基礎dbms。對於列類型,我們使用DECIMAL(precision,scale)。在你的情況下,就像DECIMAL(5,2)那樣。在我們的businesslogic(JAVA)中,我們使用BigDecimal。

相關問題