在Ruby on Rails 3.0.5中使用number_with_precision对具有大精度的数字

时间:2011-11-25 11:16:41

标签: ruby-on-rails ruby-on-rails-3

我正在开发一个Ruby-on-Rails 3.0.5应用程序,它有许多数字字段。上面已经规定,所有数字“数量”字段都以15的精度存储(即小数点后15位)。

在一个特定字段中,存储的数字是99999.999999999900000。要在屏幕上显示它,应用程序只是这样做

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

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

99999.999999999898137

同样,当输入99999.999999999999999(是,那是正确的。小数点后15位)时,该数字显示为100000.000000000000000,即使它存储在数据库中,并且9s在他们的荣耀中。

我可以删除number_with_precision的使用,只需执行&lt;%= item.quantity%&gt; ,这显示正常,但我相信本地化需要number_with_precision(这对于申请)。

那么,这是number_with_precision的错误吗?是否有另一种方法可以格式化与本地化一起使用的大型精确数字?或者由于浮点运算,这是不可避免的?

我确实意识到进入如此大量的小数位是相当不必要的,降低精度水平可能是要走的路,但我需要一个令人信服的论据来说服权力。 / p>

2 个答案:

答案 0 :(得分:5)

如果您将99999.999999999900000转换为64位二进制,则可获得

11000011 01001111 1.1111111 11111111 11111111 11111111 11001000 00000000

转换回

99999.999999999898137

不是一个真正的错误,这个数字太大了,无法保存在64位条目中。 我想你要么找到一种方法来保存128位二进制文​​件,以另一种方式保存它或处理缺乏精度:)

答案 1 :(得分:0)

&lt;%= any.thing%&gt;将any.thing转换为字符串:
 any.thing.to_s

也许这就是你的bug所在。我现在坚持使用坏的导轨安装,无法测试。

在irb或/和rails控制台中尝试99999.999999999999999.to_s。可能你会得到100000.0。