在Ruby on Rails 3.0.5中以高精度使用number_with_precision

Tim*_*m C 1 ruby-on-rails ruby-on-rails-3

我正在研究Ruby-on-Rails 3.0.5应用程序,该应用程序具有许多数字字段。上面的那些人已经裁定,所有数字“数量”字段的存储精度为15(即小数点后15位)。

在一个特定的字段中,存储的数字为99999.999999999900000。要将其显示在屏幕上,应用程序只需执行此操作

<%= number_with_precision(item.quantity, :precision => 15) %>
Run Code Online (Sandbox Code Playgroud)

但是,这将在页面上显示以下内容

99999.999999999898137
Run Code Online (Sandbox Code Playgroud)

同样,当输入99999.999999999999999(是的,是的。小数点后15位)时,该数字将显示为100000.000000000000000,即使它存储在数据库中,其所有荣耀都为9。

我可以删除对number_with_precision的使用,而只需执行<%= item.quantity%>,这样就可以正常显示,但是我相信number_with_precision对于本地化是必需的(这对于应用程序很重要)。

那么,这是number_with_precision的错误吗?是否有另一种方式格式化与本地化兼容的大精度数字?还是由于浮点运算而无法避免?

我的确意识到,输入如此多的小数位数是不必要的,降低精度水平可能是要走的路,但是我将需要有说服力的论据来说服即将成为现实的力量。

Vik*_*kko 5

如果将99999.999999999900000转换为64位二进制文​​件,则会得到

11000011 01001111 1.1111111 11111111 11111111 11111111 11001000 00000000
Run Code Online (Sandbox Code Playgroud)

转换回

99999.999999999898137
Run Code Online (Sandbox Code Playgroud)

这不是一个真正的错误,数量太大而无法保存在64位条目中。我认为您要么需要找到一种方法来保存它的128位二进制文​​件,要么以另一种方式保存它,或者应对精度不足的问题:)