Java代码if语句异常:循环无法终止及格式化输出错误排查
Java代码问题分析与修复
原代码
import java.io.IOException; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner s = new Scanner(System.in); double A=0, J=1; int aux=0; for(int i = 0; ; i++){ if(A%1==0.0 && J%1==0.0) { System.out.printf("I=%.0f J=%.0f\n", A, J); } else if(A%1!=0 && J%1==0) { System.out.printf("I=%.1f J=%.0f\n", A, J); } else if(A%1==0 && J%1!=0) { System.out.printf("I=%.0f J=%.1f\n", A, J); } else if(A%1!=0 && J%1!=0) { System.out.printf("I=%.1f J=%.1f\n", A, J); } J++; aux++; if(A==2 && aux==3) { break;} if(aux==3){ A+=0.2; J+=0.2; J-=3; aux=0;} } } }
预期输出
I=0 J=1 I=0 J=2 I=0 J=3 I=0.2 J=1.2 I=0.2 J=2.2 I=0.2 J=3.2 ... I=2 J=5
存在的核心问题
- 循环无法终止:
if(A==2 && aux==3) { break;}永远不会触发。原因是浮点数精度缺陷,A通过多次+=0.2累加后,实际值是类似2.000000000000001的近似值,而非精确的2.0,导致A==2的判断不成立。 - 输出格式异常:当
A和J逻辑上为整数时,多数情况会输出I=2.0 J=5.0而非预期的I=2 J=5。这是因为浮点数精度误差会导致A%1==0.0的判断失效,程序会错误进入带小数的输出分支。
修复方案
修复后的代码
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner s = new Scanner(System.in); // 用整数计数避免浮点数精度问题,A的实际值为 aInt * 0.2 int aInt = 0; double J = 1; int aux = 0; while (true) { double A = aInt * 0.2; // 动态判断数值是否为整数,选择对应输出格式 String aFormat = (A == Math.floor(A)) ? "%.0f" : "%.1f"; String jFormat = (J == Math.floor(J)) ? "%.0f" : "%.1f"; System.out.printf("I=%s J=%s\n", String.format(aFormat, A), String.format(jFormat, J)); J++; aux++; // 当aInt=10时,对应A=2.0,满足aux=3时终止循环 if (aInt == 10 && aux == 3) { break; } if (aux == 3) { aInt++; J += 0.2; J -= 3; aux = 0; } } } }
修复说明
- 解决循环终止问题:
改用整数aInt记录累加次数,A的实际值通过aInt * 0.2计算,彻底避免浮点数累加的精度误差。当aInt=10时,A精确等于2.0,此时配合aux==3的条件可正确触发循环终止。 - 解决输出格式问题:
通过Math.floor()判断数值是否为整数,动态选择格式化字符串。无论浮点数是否存在精度误差,只要逻辑上是整数,就会用%.0f格式输出,避免多余的.0后缀。
内容的提问来源于stack exchange,提问作者GABRIEL EURIPEDES VIEIRA CORRE
相关产品推荐
相关产品推荐

