Java判断数是否为无理数的程序无法编译,求排查原因
程序无法编译的原因分析
我尝试编写一个通过判断位数是否无限来确定输入值是否为无理数的程序:若位数无限则标记为无理数,否则为有理数。但输入3.14时程序崩溃,无法输出无理数或有理数的结果,代码如下:
import java.math.BigDecimal; import java.util.Scanner; public class non_terminating_decimals { public static void main(String[] args) { Scanner inputNumber = new Scanner(System.in); System.out.println("input number : "); BigDecimal inputnumber = inputNumber.nextBigDecimal(); BigDecimal numerofDigits = input(new BigDecimal(String.valueOf(inputnumber))); BigDecimal infinity = BigDecimal.valueOf(Double.POSITIVE_INFINITY); if (numerofDigits == infinity) { System.out.println("Irrational"); } else { System.out.println("Rational"); } } static int integerDigits(BigDecimal number) { return number.signum() == 0 ? 1 : number.precision() - number.scale(); } static BigDecimal input(BigDecimal number) { return BigDecimal.valueOf(0); } }
导致编译失败的关键问题
- 非法字符串符号:代码里的
"是HTML的双引号转义字符,Java编译器无法识别该符号,必须替换为原生双引号"。比如把System.out.println("input number : ");改成System.out.println("input number : ");,否则第一步编译就会报错。 - BigDecimal不支持无穷大值转换:
BigDecimal.valueOf(Double.POSITIVE_INFINITY);这行代码即便解决了符号问题,编译通过后运行也会触发ArithmeticException。因为BigDecimal的设计目标是存储精确十进制数,不支持无穷大这类非精确值,无法将Double的无穷大值转换为有效的BigDecimal实例。
另外还有几个逻辑错误(不影响编译,但会导致程序运行异常或结果完全错误):
- 对象比较方式错误:用
==比较BigDecimal是对比内存地址,而非数值相等,正确做法是使用numerofDigits.equals(infinity)或者compareTo方法。 - 核心判断逻辑缺失:自定义的
input方法始终返回BigDecimal.valueOf(0),完全没有实现计算小数位数的功能;同时编写好的integerDigits方法从未被调用,整个程序的判断逻辑形同虚设。
内容的提问来源于stack exchange,提问作者ColorTheory42
相关产品推荐
相关产品推荐

