You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

修复说明

  1. 解决循环终止问题:
    改用整数aInt记录累加次数,A的实际值通过aInt * 0.2计算,彻底避免浮点数累加的精度误差。当aInt=10时,A精确等于2.0,此时配合aux==3的条件可正确触发循环终止。
  2. 解决输出格式问题:
    通过Math.floor()判断数值是否为整数,动态选择格式化字符串。无论浮点数是否存在精度误差,只要逻辑上是整数,就会用%.0f格式输出,避免多余的.0后缀。

内容的提问来源于stack exchange,提问作者GABRIEL EURIPEDES VIEIRA CORRE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:35:15