Java中如何正确处理NaN?二次方程求解输出NaN问题排查
核心问题
根据IEEE 754浮点数标准规定,NaN(非数字)与任何值做相等比较的结果都为false,哪怕是和NaN本身比较也一样:
Double.NaN == Double.NaN的返回结果是false
你代码中所有== Double.NaN、!= Double.NaN的判断逻辑永远不会触发预期分支,自己实现的isNaN方法也因为同样的原因完全失效,所以无实根场景下会直接打印出NaN。
修正方案
1. 优先复用现有逻辑(更推荐)
你已经在QuadraticEquation类中实现了hasSolutions()方法判断判别式delta是否大于等于0,直接调用该方法即可提前判断是否有实根,不需要后续再判断NaN,逻辑更清晰性能也更好:
// 替换main方法中所有解判断的代码块 if (!equation1.hasSolutions()) { System.out.println("There are no real solutions"); System.out.println("The first solution is not real"); System.out.println("The second solution is not real"); } else { System.out.println("The first solution is: " + equation1.getSolution1()); System.out.println("The second solution is: " + equation1.getSolution2()); System.out.println(equation1.getAllSolutions()); }
2. 用JDK内置方法判断NaN
如果确实需要单独判断某个double值是否为NaN,直接调用JDK自带的Double.isNaN()静态方法即可,删除你自己实现的错误的isNaN方法:
// 单独判断第一个解是否为NaN的示例 if (Double.isNaN(equation1.getSolution1())) { System.out.println("The first solution is not real"); } else { System.out.println("The first solution is: " + equation1.getSolution1()); }
内容的提问来源于stack exchange,提问作者Matteo Didonè
相关产品推荐
相关产品推荐

