首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >除以零误差

除以零误差
EN

Stack Overflow用户
提问于 2010-03-10 11:09:59
回答 4查看 22.3K关注 0票数 5

下面是代码(java):

代码语言:javascript
复制
class prime
{

    public static boolean prime (int a, int b) 
    { 
        if (a == 0) 
        {
            return false; 
        }
        else if ((a%(b-1) == 0) && (b>2))
        {
            return false; 
        }
        else if (b>1) 
        {
            return (prime (a, b-1)) ;
        }
        else
        {
            return true; 
        }

    }

    public static void main (String[] arg) 
    {
        System.out.println (prime (7, 7)) ; 
    }
}

这是我尝试运行它时得到的错误消息(它编译得很好):

代码语言:javascript
复制
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at prime.prime(prime.java:10)
    at prime.prime(prime.java:16)
    at prime.prime(prime.java:16)
    at prime.prime(prime.java:16)
    at prime.prime(prime.java:16)
    at prime.prime(prime.java:16)
    at prime.prime(prime.java:16)
    at prime.main(prime.java:27)

所以这意味着我被零除了,对吗?或者这意味着什么呢?我不明白我怎么除以0。哪里出了问题?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-10 11:13:24

试着扭转局面

代码语言:javascript
复制
if ((a%(b-1) == 0) && (b>2))

代码语言:javascript
复制
   if ((b>2) && a%(b-1)==0)

发生的情况是在b>2测试之前执行a%(b-1)操作。

切换之后,您可以利用short-circuit evaluation。一旦b>2测试返回false,就不需要计算模数(从而避免除法)

票数 15
EN

Stack Overflow用户

发布于 2010-03-10 11:12:37

由于您的递归调用:

代码语言:javascript
复制
return (prime (a, b-1)) ;

在某个时刻,您将调用prime,b的值为1。这意味着在您的第二个条件下,您将测试a%0。由于模运算符(%)本质上是一个除法,这带来了除以零的问题。

解决方案可能是在执行%之前捕获这种情况,以在您的条件下强制执行b>2。

票数 2
EN

Stack Overflow用户

发布于 2018-09-13 01:17:22

代码语言:javascript
复制
 A % B = C

%的数学含义是将A除以B,这个运算的提示符是C。当B0时,你会有效地问:当我们被零除时,提醒是什么?然而,在数学中,被零除是未定义的,这就是java.lang.ArithmeticException的原因

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2414250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档