2011-11-25 144 views
0

我正在使用Ruby-on-Rails 3.0.5應用程序,該應用程序有許多數字字段。它已被上面的那些規定,所有的數字「數量」字段以15的精度(即小數點後15位)存儲。在具有高精度的數字上使用Ruby on Rails 3.0.5中的number_with_precision

在一個特定的字段中,存儲的號碼是99999.999999999900000。要在屏幕上顯示它的應用程序是簡單地做這個

<%= number_with_precision(item.quantity, :precision => 15) %> 

然而,這種在頁面上顯示以下

99999.999999999898137 

同樣,當進入99999.999999999999999(是的,這是正確的。15位小數) ,那麼該數字將顯示爲100000.000000000000000,即使該數字存儲在數據庫中並且所有的榮耀都是9。

我可以刪除使用number_with_precision的,只是做<%= item.quantity%>,這顯示它很好,但我認爲是需要本地化(這是很重要的應用程序)number_with_precision。

那麼,這是一個number_with_precision的錯誤?是否有另一種方式來格式化與本地化一起使用的大型精確數字?或者這是由於浮點算術而無法避免的?

我的確意識到輸入如此大的小數點位數是不必要的,而降低精確度水平可能是一條可行的路線,但我需要一個令人信服的論證來說服這種能力。

回答

4

如果轉換99999.999999999900000到64二進制你

11000011 01001111 1.1111111 11111111 11111111 11111111 11001000 00000000 

其轉換回

99999.999999999898137 

不是一個真正的錯誤,這個數字僅僅是太大,被保存在一個64位條目。 我想你要麼找到一種方法來保存它的128位二進制,保存在另一種方式或處理缺乏精度:)

0

<%= any.thing%>將any.thing%>字符串:
any.thing.to_s

也許這就是你錯誤的地方。我現在陷入了一個糟糕的安裝軌道,無法測試。

在irb或/和rails控制檯中嘗試99999.999999999999999.to_s。可能你會得到100000.0。

+0

99999.999999999999999.to_s確實返回100000.0。然而99999.999999999900000.to_s返回99999.9999999999,而不是99999.999999999898137,正如我的問題所述,所以在這裏可能有多個錯誤... –