Ruby除法无穷大/NaN应返回0

Ruby除法无穷大/NaN应返回0,ruby,Ruby,我有一个RubyonRails上的应用程序 在应用程序中,我想覆盖Ruby中除法的父类 用于处理以下异常 我到处搜索。我想在应用程序中重写ruby除法 所以对于下面的结果,它应该返回零 0.0 / 0 => NaN 1.0 / 0 => Infinity ZeroDivisionError: divided by 0 我可以通过在除法操作时到处更改代码来处理它。但是我想通过重写方法本身来节省时间。重写Fixnum、Decimal等的除法是可能的,但对您来说可能不是最好的解

我有一个RubyonRails上的应用程序

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

用于处理以下异常

我到处搜索。我想在应用程序中重写ruby除法

所以对于下面的结果,它应该返回零

0.0 / 0
 => NaN 

1.0 / 0
 => Infinity 
ZeroDivisionError: divided by 0

我可以通过在除法操作时到处更改代码来处理它。但是我想通过重写方法本身来节省时间。

重写
Fixnum
Decimal
等的除法是可能的,但对您来说可能不是最好的解决方案。您需要重写几个类中的方法,它们可能会有一些非常糟糕的副作用(请记住,这些方法不仅仅是从代码中调用的!!)

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

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
非常类似于:


我知道上面的代码可能不是你想要的。您可以随意定制它=)

您不需要特殊的方法,也不需要像其他答案状态那样扩展float类

Ruby为这个名为.finite的Float类提供了一个方法

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


上面的例子有点冗长。

希望我永远不会在ruby core因懒惰而被猴子修补的代码库上工作'sakeHow is this
a=0 if(0.0/0).nan;如果(1.0/0).无限大,则b=0;a#=>0b#=>0
?@Arup,谢谢,但我想覆盖ruby中的父除法…我正在应用程序中的近200个位置上执行此操作。所以最好在应用程序中编写我们自己的划分方法。具体问题是什么?这是一个方法。@DaveNewton,由于Nan和无穷大返回,应用程序正在崩溃。我总是想要输出或零。我在应用程序中多次使用此除法运算。所以我只想重写除法,将返回类型改为零..这就像在所有地方重写代码..我不喜欢..你能建议我如何重写除法吗?我不同意-你把逻辑保留在一个地方。你可以按照@Abdo的建议去做,但是你必须为
Decimal
Fixnum
,以及其他人去做,这样你才能得到相同的最终结果——然后你很可能会破坏其他东西——这将是一个很难跟踪的问题……我只是用0.0替换NAN和INFINITY这让我想哭。每次调用这个密码,上帝都会杀死一只小狗。@zettetichaha。。是的,但如果你想一想,比如在网络应用中,你使用division的频率是多少?(哈哈,如果我们重写除法运算符并添加一个我们可以知道的计数器的话)@Abdo更大的问题是:这如何影响代码库工作的难度?当未来的程序员编写依赖于原始行为的代码时会发生什么?最好显式地解救错误,而不使用
Float
类。你可能认为你在节省时间,但从长远来看,你会为此付出代价。@Zettic我同意,这是非常危险的,我提供的代码只是出于教育目的(我不宽恕它)。这是@SumitMunot的选择。另一方面,我个人喜欢使用
Hash
上缺少的方法通过
h.foo
查找
h[:foo]
,人们可以自由地不同意?实际上返回true或false,所以这里的false是不必要的。但这对我有帮助,我建议这是正确的,而不是像上面那样奇怪地使用
self
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
if value.finite? == false
 value = 0
else
 value = value
end