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



对浮点数采用不同的舍入方法会得到不同的结果。

"%.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的实现不同于浮动轮方法。

相关内容

  • 没有找到相关文章

最新更新