java - 使用 Typecaste (Java) 除以零异常

标签 java casting dividebyzeroexception

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

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

Exception in thread "main" java.lang.ArithmeticException: / by zero

引用第 25 行(我的 for 循环条件)。

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

最佳答案

你在这做

(number * 10) /i !=0

其中 number 是 double。

不建议将 float 用于比较,因为它们的存储方式(以尾数和指数形式)。所以,如果这个条件返回真,你就幸运了。

因为你的循环有点像永无止境的循环。你得到算术异常的原因是你在这个无限循环中将 i 乘以 10。 “i”达到 32 位的“整数”限制并溢出,最终使所有这 32 位为 0。

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

(number * 10) /i 

(number % i) - digit)/(i / 10)

关于java - 使用 Typecaste (Java) 除以零异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32730981/

相关文章:

java - 了解大型 Java 代码库

c# - 无法将类型为 'System.Security.Claims.ClaimsIdentity' 的对象转换为类型 'System.Security.Principal.WindowsIdentity'

java - 为什么用浮点(或 double )数字除以零不会抛出 java.lang.ArithmeticException :/by zero in Java

当在循环内使用计数器时 C++ 程序崩溃

java - 带 SSL 的 Jetty HTTP 客户端

java - Struts逻辑问题

java - 转换为 int 时添加 0 但不显示为两位数

c++ - 将 filtering_istream 类型的变量转换为 ifstream 类型?

java - 欺骗 JVM 转换数组

c# - 如何评估 C# 中可以被零除的字符串表达式?