用Typecaste(Java)除零异常

用Typecaste(Java)除零异常,java,casting,dividebyzeroexception,Java,Casting,Dividebyzeroexception,在运行时,我会收到错误消息 线程“main”java.lang.arithmetricException中的异常:/by零 参考第25行(my for loop conditions) 循环运行良好,直到我尝试将数字的值转换为int,我不确定为什么这会导致循环的任何部分被零除。我已经讨论了关于使用有理表达式的条件的所有可能性,并且不能推导出任何分母都将设置为零的偶然性。不管输入的是什么数字,我都会得到这个错误。如果不是因为我的教授提供了一个数值超过了在他的一个测试用例中可以存储在int中的数值,

在运行时,我会收到错误消息

线程“main”java.lang.arithmetricException中的异常:/by零

参考第25行(my for loop conditions)


循环运行良好,直到我尝试将数字的值转换为int,我不确定为什么这会导致循环的任何部分被零除。我已经讨论了关于使用有理表达式的条件的所有可能性,并且不能推导出任何分母都将设置为零的偶然性。不管输入的是什么数字,我都会得到这个错误。如果不是因为我的教授提供了一个数值超过了在他的一个测试用例中可以存储在int中的数值,我根本不会选择将这个数字保存为double。该程序在类型转换之前运行良好,并为所有其他测试用例提供了正确答案。

第一次控制进入循环时,
位的值将为零,而不是您预期的输入数字的最后一位。此外,还需要修复循环终止条件,因为这是错误的。例如,如果数字是123,那么在最后一次预期迭代中,
1230/1000=1
和not
0
循环不会结束,而是导致溢出。您可以使用以下选项:

import java.util.Scanner;


public class SumDigits {

public static void main(String[] args)
{
    // TODO Auto-generated method stub

    Scanner input = new Scanner(System.in);

    // prompt the user to enter a value and store it as the integer called number
    System.out.print("Enter an integer: ");
    double number = Math.abs(input.nextDouble());

    System.out.println("The sum of the digits is " + sumNumbers(number));

    input.close();
}
public static int sumNumbers (double number)
{

    int sum = 0;

    for (int i = 10, digit = 0; (number * 10) /i !=0; i *= 10, digit = (int)((number % i) - digit)/(i / 10))
    {
        sum += digit;
    }

    return sum;
}
}
这应该是可行的,但我再次建议您改进此代码,因为这不是理想的方法

测试:

输入一个整数:3456

数字之和为18

算术异常的根本原因是循环条件不正确。添加
System.out.println(“i=“+i+”i*10=“+(i*10))生成输出:

public static int sumNumbers (double number)
    {
        int sum = 0;
        for (int i = 10, digit = (int)(number % i); digit != 0; i *= 10, digit = (int)((number % i) - digit)/(i / 10))
        {
            sum += digit;
        }

        return sum;
    }
你在这儿干什么

i=10 i*10=100
i=100 i*10=1000
i=1000 i*10=10000
i=10000 i*10=100000
i=100000 i*10=1000000
i=1000000 i*10=10000000
i=10000000 i*10=100000000
i=100000000 i*10=1000000000
i=1000000000 i*10=1410065408
i=1410065408 i*10=1215752192
i=1215752192 i*10=-727379968
i=-727379968 i*10=1316134912
i=1316134912 i*10=276447232
i=276447232 i*10=-1530494976
i=-1530494976 i*10=1874919424
i=1874919424 i*10=1569325056
i=1569325056 i*10=-1486618624
i=-1486618624 i*10=-1981284352
i=-1981284352 i*10=1661992960
i=1661992960 i*10=-559939584
i=-559939584 i*10=-1304428544
i=-1304428544 i*10=-159383552
i=-159383552 i*10=-1593835520
i=-1593835520 i*10=1241513984
i=1241513984 i*10=-469762048
i=-469762048 i*10=-402653184
i=-402653184 i*10=268435456
i=268435456 i*10=-1610612736
i=-1610612736 i*10=1073741824
i=1073741824 i*10=-2147483648
i=-2147483648 i*10=0
数字是双倍的

浮点数不建议用于比较,因为它们的存储方式(尾数和指数形式)。所以,如果这个条件返回真的,考虑你自己幸运。 正因为如此,你的循环是一个永无止境的循环。你得到算术异常的原因是,在这个无限循环中,你将i乘以10。“i”达到32位的“整数”限制并溢出,最终使所有32位为0

实际上,i=0,以下两个抛出都被零除

(number * 10) /i !=0


是的,我必须这样做,否则它不会把循环中的最后一个数字加到总和上。我试图在相同的条件下将I修改为(I/10),但出现了一个错误。正如我所说,在我将数字更改为双精度之前,代码输出有效输入的正确答案。您遇到的一个问题是,如果数字对于int来说太大,我也会溢出。谢谢!是不是因为循环的条件太多而不理想?我想在身体里放一些,但我想尝试做一个更大的for循环,因为我从来没有尝试过一个有超过3个条件的循环。我不明白你为什么要做一个更大的循环条件。您应该只有所需的内容,因为它在调试时也会很有帮助:)
(number * 10) /i 
(number % i) - digit)/(i / 10)