Ruby的除零算法怎么做?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我有以下计算平均值的方法:

def compute_average(a,b,c,d,e)
  total = [a,b,c,d,e].sum.to_f
  average = [a, 2*b, 3*c, 4*d, 5*e].sum / total
  average.round(2)
end

这没什么特别的,但它有一个问题,我想所有的平均方程都有:如果输入都是零,它可能除以零。

所以,我想这么做:

def compute_average(a,b,c,d,e)
  total = [a,b,c,d,e].sum.to_f
  if total==0
    average = 0.00
  else
    average = [a, 2*b, 3*c, 4*d, 5*e].sum / total
    average.round(2)
  end
end

...这很管用,但我觉得很蠢

有什么建议吗?

提问于
用户回答回答于

你可以使用nonzero?,如:

def compute_average(a,b,c,d,e)
  total = [a,b,c,d,e].sum.to_f
  average = [a, 2*b, 3*c, 4*d, 5*e].sum / (total.nonzero? || 1)
end

更多的人会更熟悉使用三元运算符(total == 0 ? 1 : total),所以这是另一种可能性。

用户回答回答于

通常依靠rescue捕获异常,然后返回默认值:

def compute_average(a, b, c, d, e)
  total = [a, b, c, d, e].sum.to_f
  average = [ a, 2*b, 3*c, 4*d, 5*e ].sum / total
  average.round(2)
  rescue ZeroDivisionError
    0.0
end

另外我会写:

average = numerator / denominator unless denominator == 0 then 0

average = (denominator == 0) ? 0 : numerator / denominator

扫码关注云+社区