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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 23:53:10