Java抵押计算器输入年利率触发InputMismatchException问题求助
解决Java抵押计算器的InputMismatchException异常
问题原因
你遇到的InputMismatchException是因为Scanner的nextFloat()方法会根据操作系统默认的区域设置解析浮点数。如果你的系统(比如中文系统)默认用逗号,作为小数分隔符,而你输入的是点.(比如3.92),就会触发这个解析错误。
解决方案
最直接的修复方式是强制Scanner使用美式区域规则(和你代码里格式化货币的区域一致),这样就能识别.作为小数分隔符。
方法1:给Scanner指定US区域
修改创建Scanner的代码,添加useLocale(Locale.US):
Scanner scanner = new Scanner(System.in).useLocale(Locale.US);
方法2:改用double类型(推荐)
Java中double的精度比float更高,适合金融计算场景。可以把代码中的float换成double,同时配合Scanner的区域设置:
// 读取年利率时用nextDouble() double annualInterest = scanner.nextDouble(); double monthlyInterest = annualInterest / PERCENT / MONTHS_IN_YEAR;
完整修复后的代码
以下是采用方法2的完整代码:
import java.text.NumberFormat; import java.util.Locale; import java.util.Scanner; public class Main { public static void main(String[] arg) { final byte MONTHS_IN_YEAR = 12; final byte PERCENT = 100; Scanner scanner = new Scanner(System.in).useLocale(Locale.US); System.out.print("Principal: "); int principal = scanner.nextInt(); System.out.print("Annual Interest Rate: "); double annualInterest = scanner.nextDouble(); double monthlyInterest = annualInterest / PERCENT / MONTHS_IN_YEAR; System.out.print("Period (Years): "); byte years = scanner.nextByte(); int numberOfPayments = years * MONTHS_IN_YEAR; double mortgage = principal * (monthlyInterest * Math.pow(1 + monthlyInterest, numberOfPayments)) / (Math.pow(1 + monthlyInterest, numberOfPayments) - 1); String mortgageFormatted = NumberFormat.getCurrencyInstance(Locale.US).format(mortgage); System.out.println("Mortgage: " + mortgageFormatted); } }
验证
现在输入3.92作为年利率,Scanner会正确解析这个浮点数,不会再抛出异常,程序能正常计算并输出格式化后的抵押贷款金额。
内容的提问来源于stack exchange,提问作者Tamer Karar
相关产品推荐
相关产品推荐

