对浮点数采用不同的舍入方法会得到不同的结果。
"%.2f" % 0.015 # => "0.01"
0.015.round(2) # => 0.02
一个是string,另一个是float。当舍入0.5以外的值时,它会正确舍入,或者与round函数的舍入方式相同。
"%.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"]
我不确定这在技术上是否是一个bug,但至少它是非常反直觉的。有人知道为什么两种舍入方法的行为不同吗?
浮点值并不总是精确存储——它们被存储为基数和指数,有些数字是精确存储的,有些数字不是。对浮点数的任何修改都可能导致出现非常小的分数。因此,在边界处使用不同的舍入函数可以使其在两种可能的结果之间切换。
做"%.2f" % 0.015.round(2)
会给你你想要的0.02
结果,因为我猜%.2f
的实现不同于浮动轮方法。