Ruby division infinity / NaN应该返回0

时间:2014-02-17 20:57:59

标签: ruby

我在Ruby On Rails上有一个应用程序。

在应用程序中,我想在Ruby中覆盖除法的父类

用于处理以下异常。

我到处搜索。我想在应用程序中覆盖ruby division方法。

因此,对于以下结果,它应该返回零。

0.0 / 0
 => NaN 

1.0 / 0
 => Infinity 
ZeroDivisionError: divided by 0

我可以通过在除法运算时到处更改代码来处理它。但我希望通过覆盖方法本身来节省时间。

3 个答案:

答案 0 :(得分:5)

您不需要特殊方法或扩展float类,因为其他答案状态。

Ruby为您提供了一个名为.finite的类的方法。

http://ruby-doc.org/core-1.9.3/Float.html#method-i-finite-3F

  

有限? →真或假   如果flt是有效的IEEE浮点数(它不是无限的,并且nan?为假),则返回true。

if value.finite? == false
 value = 0
else
 value = value
end

上面的例子有点冗长。

答案 1 :(得分:3)

非常类似于:How can I redefine Fixnum's + (plus) method in Ruby and keep original + functionality?

class Float
  alias_method :old_div, :/

  def /(y)
    return NAN if self == y && y == 0.0
    return INFINITY if self == 1.0 && y == 0.0
    self.old_div(y)
  end
end

我知道上面的代码可能不是你想要的。随意按照您想要的方式自定义=)

答案 2 :(得分:2)

覆盖FixnumDecimal等的划分是可能的,但可能不是最适合您的解决方案。你需要覆盖几个类中的方法,并且它们可能有一些非常讨厌的副作用(记住 - 这些方法不是只从你的代码中调用!!)

我建议你写一些帮助器模块,它将实现这个新行为,你可以调用它而不是/

module WeirdMath
  self.div(n1, n2)
    result = n1 / n2
    result.nan? || result.infinite? ? 0 : result
  rescue
    0
  end
end

WeirdMath.div(0.0, 0) # => 0
WeirdMath.div(1.0, 0) # => 0
WeirdMath.div(3.0, 2) # => 1.5