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"); } }
问题原因
- 无限循环导致卡顿:循环逻辑存在致命缺陷——当初始存款足够大时,每月产生的利息会大于等于500元支取额。此时
bal += (利息 - 500)的结果会让余额只增不减,永远不会降到0以下,do-while循环无限执行,程序因此卡顿。
临界值计算:当bal * 0.005 >= 500(即bal >= 100000)时,利息刚好覆盖支取额,余额不再减少;超过这个数值,余额持续增长,循环永远无法终止。 - 数据类型不是核心问题:更换
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
相关产品推荐
相关产品推荐

