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

为何Java将3位小数输入转为Integer?其他位数小数却判定非法

为啥你的程序对3位小数“网开一面”?其实是Scanner的小把戏!

咱们先拆解一下你代码里nextInt()的真实行为——它可不是直接把输入的数字“砍掉小数转成int”,而是有一套固定的规则:

  • 首先会跳过输入里的空格、换行这些空白字符
  • 然后读取一个完整的“token”(简单说就是被空白符隔开的一串字符),再尝试把这个token转成int
  • 如果这个token里有小数点、字母这类非数字字符,转不动了,就会抛出InputMismatchException

你遇到的奇怪现象,大概率是输入时的空格位置搞的鬼:

  • 要是你输入的是 123 .456(注意整数和小数点之间有空格):这时候nextInt()只拿第一个token123,转成int返回,程序自然会输出你的年龄。剩下的.456会留在输入缓冲区里,但你的程序没继续读它,所以你误以为程序“忽略了三位小数”。
  • 但如果你输入的是 12.34 或者 1234.5678(整数和小数之间没空格):这一整串是一个token,nextInt()看到里面有小数点,知道转不成int,直接抛出异常,进入catch块输出错误提示,返回0,程序就不会输出年龄了。

当然还有一种小可能:你是不是把6位整数(比如123456)当成了“带三位小数的数值”?那nextInt()肯定能正常解析成int呀。

验证一下这个逻辑

你可以在代码里加几行,看看输入缓冲区里剩下的东西:
比如在main方法的输出语句后面加:

if (userInput.hasNext()) {
    System.out.println("输入缓冲区还剩:" + userInput.next());
}

运行后你就会发现:输入带空格的“整数+小数”时,剩下的小数部分会被打印出来;输入无空格的带小数点内容时,程序直接报错,不会走到这一步。

要是想严格只接受纯整数输入

如果你希望不管输入里有没有小数点,只要不是纯整数就判定非法,可以改成用nextLine()读整行,再手动解析:

public static int checkValidAge() {
    String input = userInput.nextLine().trim(); // 读整行并去掉前后空格
    try {
        return Integer.parseInt(input);
    } catch (NumberFormatException e) {
        System.out.print("That isn't a whole number");
        return 0;
    }
}

这样不管是12.3还是123.456,只要不是纯整数,都会被判定为非法输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:49:20