【问题标题】:Is it a good practice to add a very small number to the divisor not to deal with division by zero exception?将一个非常小的数字添加到除数以不处理除零异常是一种好习惯吗?
【发布时间】:2016-12-23 11:59:01
【问题描述】:

我想保持我的代码干净并避免不必要的 IF 分支。
将一个非常小的数字添加到除数以不处理除零异常是一种好习惯吗?下面的代码被认为是一个好习惯吗?
我知道在这种情况下,这种比较并非完全 100% 准确,但没关系。

double safeDivision(double dividend, double divisor)
{
    return (dividend + Double.MIN_VALUE)/(divisor + Double.MIN_VALUE);
}

【问题讨论】:

  • 没有。试试divisor = -Double.MIN_VALUE
  • @ElliottFrisch 你为什么要否定它?
  • 如果除数非常小,那么您甚至有数值溢出的风险。
  • @IvayloStrandjev 为什么调用者不能否定它?他们会用你的方法得到一个特别不准确的结果。
  • 你们真的在讨论这个想法吗?!?为什么?最初的前提只是……哦,没关系。

标签: java double divide-by-zero


【解决方案1】:

为什么要在 double 的上下文中担心这个?

System.out.println( 1.0 / 0.0);
System.out.println( 0.0 / 0.0);
System.out.println(-1.0 / 0.0);

产量

无限

-无限

...毕竟,这是正确的结果,对吧?引入不准确只会以一种完全不同的、意想不到的方式咬你。不要这样做。

【讨论】:

  • 只是作为一个书呆子,(-)1/0 ≠ (-)无穷大,在现实生活中的数学是不确定的。画出 f(x) = (-)1/x 的图,你就会明白为什么了。
  • @coudy:这不是现实生活中的数学。这是现实生活中的 Java,其中(1.0 / 0.0 == Double.POSITIVE_INFINITY) == true
  • 是的。我想我只是担心人们会以绝对的方式解释“正确的结果”,而不是“Java 这么说”正确。 :)
  • @coudy:所以你实际上是在说 Java 正在传播“假新闻”?
  • 嗯,“另类事实”,真的
【解决方案2】:

不,它会产生不需要的结果。您如何处理“调整后”除以 0 的数字?

有效的代码总是比干净但可能有错误的代码更好

【讨论】:

  • 正如我所说:在这种情况下,稍微“调整”的结果并不重要。结果值将被四舍五入,潜在的数字问题可以忽略不计
  • 是的,但是如果你将某个值除以 0,0000000..01,你可能会处理一个不需要的大数字,这可能会导致溢出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
相关资源
最近更新 更多