除以零误差

问题描述 投票:4回答:4

这是代码(java):

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)) ; 
    }
}

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

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)

所以这意味着我除以零一些如何正确?或者它意味着什么?我不知道我是如何除以零的。什么地方出了错?

java divide-by-zero
4个回答
14
投票

试着转过来

if ((a%(b-1) == 0) && (b>2))

   if ((b>2) && a%(b-1)==0)

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

切换后,你正在利用short-circuit evaluation。一旦b> 2测试返回false,则无需计算模数(因此避免了除法)


2
投票

因为你的递归电话:

return (prime (a, b-1)) ;

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

解决方案可能是为了捕捉这种情况,在执行%之前强制执行b> 2。


0
投票

我假设x % 0形式的任何代码都会抛出此错误。您的代码无法防范这种可能性。


0
投票
 A % B = C

%的数学意义是你用A划分B,并且提醒你这个操作是C。当B0时,你有效地询问当我们除以零时的提醒是什么。在数学中虽然被零除以是未经分解的,这就是java.lang.ArithmeticException的原因

© www.soinside.com 2019 - 2024. All rights reserved.