Ruby:sum与inject(:+)产生不同的结果

时间:2018-05-14 21:01:20

标签: arrays ruby inject

我注意到array.sumarray.inject(:+)会产生不同的结果。这是什么原因?

a = [10, 1.1, 6.16]

a.inject(:+)
# => 17.259999999999998

a.sum
# => 17.26

1 个答案:

答案 0 :(得分:7)

Array#sum的某些输入是浮点数时,{{1}}的C实现委托给Kahan summation algorithm

此算法......

  与明显的方法相比,

...显着减少了通过添加有限精度浮点数序列获得的总数中的数值误差。这是通过保持单独的运行补偿(一个变量来累积小错误)来完成的。

     

- Wikipedia

请参阅Array#sumimplementation on Github