Tru*_* Lê 2 ruby-on-rails helper
我很好奇为什么Ruby渲染小数,精度为2不一致.
例如:
helper.number_to_currency 9.995
Run Code Online (Sandbox Code Playgroud)
=>"9.99美元"
同时
helper.number_to_currency 10.995
Run Code Online (Sandbox Code Playgroud)
=>"11.00"......应该是"10.99美元"吗?
这是一个浮点精度误差.我可能会提交一个补丁来解决这个问题,因为我在我的网站上也使用了number_to_currency.
以下是更详细的内容:
number_to_currency最终只是打电话number_with_precision来正确格式化数字. number_with_precision立即将数字转换为Float.从本质上讲,它归结为Rails代码中的这一行:
# File actionpack/lib/action_view/helpers/number_helper.rb, line 280
rounded_number = BigDecimal.new((number * (10 ** precision)).to_s).round.to_f / 10 ** precision
Run Code Online (Sandbox Code Playgroud)
您提供的数字在转换为BigDecimal之前乘以100.看看这个简单的irb会话:
irb(main):001:0> 9.995 * 100
=> 999.4999999999999
Run Code Online (Sandbox Code Playgroud)
这个数字显然会下降到999,然后它会被100除以得到9.99.
目前我能想到的唯一解决方法是在传递数字之前进行自己的舍入.
| 归档时间: |
|
| 查看次数: |
1765 次 |
| 最近记录: |