使用默认值挽救DivisionByZero会在ruby中返回NaN吗?

时间:2014-01-17 11:08:19

标签: ruby

我希望开始救援将比率设置为零,但是它设置为NaN,这在我挽救错误以提供默认值时非常令人沮丧。

  ratio = begin
            0.0 / 0.0
          rescue ZeroDivisionError
            0
          end

  ratio = 0 if ratio.nan?

我想摆脱的代码是ratio = 0 if ratio.nan?为什么需要它?

修改 新代码如下:

  ratio = bet_money_amount_cents.to_f / total_amount.to_f
  ratio.nan? ? 0 : ratio

3 个答案:

答案 0 :(得分:10)

由于0.0 / 0.0未提出错误(ZeroDivisionError),您正在考虑。

尝试将整数除以0 时

ZeroDivisionError 引发。

42 / 0
#=> ZeroDivisionError: divided by 0

注意,只有精确0的除法才会引发异常:

42 /  0.0 #=> Float::INFINITY
42 / -0.0 #=> -Float::INFINITY
0  /  0.0 #=> NaN

我会写如下:

ratio = bet_money_amount_cents.to_f / total_amount.to_f
ratio = 0 if ratio.nan?

答案 1 :(得分:4)

因为0.0 / 0.0会产生Float::NAN(Nan),而不是抛出ZeroDivisionError例外(与0 / 0不同)

0.0 / 0.0
# => NaN
0.0 / 0
# => NaN
0 / 0
# ZeroDivisionError: divided by 0
#         from (irb):17:in `/'
#         from (irb):17
#         from C:/Ruby200-x64/bin/irb:12:in `<main>'

根据ZeroDivisionError documentation

  

尝试将整数除以0时引发。

答案 2 :(得分:2)

您可以简化代码:

ratio = total_amount == 0 ? 0 : bet_money_amount_cents.to_f / total_amount