我希望开始救援将比率设置为零,但是它设置为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
答案 0 :(得分:10)
由于0.0 / 0.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