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

Java存款计算程序输入超99999数值时卡顿无响应求助

问题:大额初始存款时程序卡顿的原因与解决思路

我正在开发一个简易程序,用于计算在每月仅支取500、仅存入一次初始金额的情况下,存款可维持的时长。但当初始金额输入超过99999时,程序持续卡顿无法加载。我已尝试更换long等数据类型,问题仍未解决。作为编程新手,恳请指教问题原因及解决思路。

import java.lang.String;
import java.util.Scanner;

public class Lab3 {
    
    public static void main(String[] args) {
        final double WITHDRAW = 500.00; 
        final double INTEREST_RATE_PER_MONTH =  0.06/12.0;
        int months = 0;
        int years; 
        Scanner in = new Scanner(System.in);
        System.out.println("Please enter the amount of money you are going to deposit to your Initial Balance:");
        double bal = in.nextDouble();

        do {
            bal += (INTEREST_RATE_PER_MONTH * bal) - WITHDRAW;
            months ++; 
        }
        while (bal > 0);

        years = months / 12; 
        
        if (years == 0) {

            String msg = "";
            msg = months + " month";

            if (months > 1){
                msg = msg + "s";
                System.out.println(msg);
            }
            else
                System.out.println(msg);
        }
        else if (years == 1){
            months = months - 12;
            String msg = "";
            msg =  years + " year and " +  months + " month";

            if (months > 1){
                msg = msg + "s";
                System.out.println(msg);
            }
            else
                System.out.println(msg);
            
        }
        else if (years > 1){
            months = months % years; 
            String msg = "";
            msg = years + " years and " + months + " month";

            if (months > 1){
                msg = msg + "s";
                System.out.println(msg);
            }
            else
                System.out.println(msg);
        }
        else
            System.out.println("0 month");
    }
}

问题原因

  1. 无限循环导致卡顿:循环逻辑存在致命缺陷——当初始存款足够大时,每月产生的利息会大于等于500元支取额。此时bal += (利息 - 500)的结果会让余额只增不减,永远不会降到0以下,do-while循环无限执行,程序因此卡顿。
    临界值计算:当bal * 0.005 >= 500(即bal >= 100000)时,利息刚好覆盖支取额,余额不再减少;超过这个数值,余额持续增长,循环永远无法终止。
  2. 数据类型不是核心问题:更换long类型无效,因为业务需要浮点计算(利息为小数),且卡顿根源是循环逻辑,而非数据溢出或精度问题。

解决思路

1. 提前拦截无限循环场景

在进入循环前,先检查初始余额是否满足“利息≥支取额”的条件,直接提示用户存款永远花不完,避免进入死循环:

double monthlyInterest = bal * INTEREST_RATE_PER_MONTH;
if (monthlyInterest >= WITHDRAW) {
    System.out.println("This deposit will last forever - monthly interest covers your withdrawal.");
    return;
}

2. 修复年份月份计算bug

原代码years > 1分支中,months = months % years逻辑错误,应改为months = months % 12来计算剩余月份数,否则会出现如“3年1个月”(实际应为3年4个月)的错误结果。

3. 优化输出逻辑(可选)

将重复的输出格式化逻辑合并,简化代码结构,提升可读性。

修正后的完整代码

import java.util.Scanner;

public class Lab3 {
    
    public static void main(String[] args) {
        final double WITHDRAW = 500.00; 
        final double INTEREST_RATE_PER_MONTH = 0.06 / 12.0;
        int months = 0;
        int years; 
        Scanner in = new Scanner(System.in);
        System.out.println("Please enter the amount of money you are going to deposit to your Initial Balance:");
        double bal = in.nextDouble();

        // 提前判断无限循环场景
        double monthlyInterest = bal * INTEREST_RATE_PER_MONTH;
        if (monthlyInterest >= WITHDRAW) {
            System.out.println("This deposit will last forever - monthly interest covers your withdrawal.");
            in.close();
            return;
        }

        // 正常循环计算时长
        do {
            bal += (INTEREST_RATE_PER_MONTH * bal) - WITHDRAW;
            months++; 
        } while (bal > 0);

        years = months / 12;
        int remainingMonths = months % 12;
        
        // 统一格式化输出
        StringBuilder msg = new StringBuilder();
        if (years > 0) {
            msg.append(years).append(years == 1 ? " year" : " years");
            if (remainingMonths > 0) {
                msg.append(" and ").append(remainingMonths).append(remainingMonths == 1 ? " month" : " months");
            }
        } else {
            msg.append(months).append(months == 1 ? " month" : " months");
        }
        System.out.println(msg);
        
        in.close();
    }
}

内容的提问来源于stack exchange,提问作者Zeyar Htoo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:01:16