两种舍入方法给出不同的结果

时间:2014-06-17 16:11:13

标签: ruby floating-point rounding floating-accuracy

浮动的两种不同的舍入方法显示不同的结果。

"%.2f" % 0.015 # => "0.01" 
0.015.round(2) # => 0.02 

一个是字符串,另一个是浮点数。当舍入除0.5以外的任何值时,它会正确地舍入或者与舍入函数相同。

"%.2f" % 0.01500000000000001 # => "0.02" 

此外,它并不总是那样:

[0.005, 0.015, 0.025, 0.035, 0.045, 0.055, 0.065, 0.075, 0.085, 0.095].map { |x| "%.2f" % x}
# => ["0.01", "0.01", "0.03", "0.04", "0.04", "0.06", "0.07", "0.07", "0.09", "0.10"]

我不确定这在技术上是否是一个错误,但至少它是非常反直觉的。有谁知道为什么两种舍入方法的行为方式不同?

1 个答案:

答案 0 :(得分:3)

浮动值并不总是精确存储 - 而是存储为基数和指数,对于某些数字而言,这些数字是精确存储而其他数字则不是。对float 的任何修改都可以导致出现非常小的一部分。因此,在具有不同舍入函数的边界处对某些内容进行舍入可以使其在两个可能的结果之间切换。

执行"%.2f" % 0.015.round(2)会为您提供所需的0.02结果,因为我猜测%.2f的实现方式与浮动方法不同。