我正在开发一个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>
答案 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。