【问题标题】:How come user input doubles do not accept the same parameters as a regular double?为什么用户输入双打不接受与常规双打相同的参数?
【发布时间】:2020-06-14 04:17:31
【问题描述】:

我目前是 Java 的初学者,我偶然发现了一些让我有点吃惊的东西。

使用扫描仪,我尝试创建一个允许我比较 2 个数字的程序。如:

num1 > num2
num2 < num1
num1 == num2

诸如此类。

我打算使用双精度数,因为它允许各种数字,从整数到小数。问题是每当我在控制台问我时输入一个数字时;如果数字有一个句号,它会给我一个不匹配的异常错误。我尝试通过实现一个scanner.nextLine()来克服这个问题;或 nextDouble() 之前的 (double);方法。但这没有用。有人可以帮帮我吗?如果我对问题的解释不够好,我会尝试进一步解释,这是我第一次使用这个网站。

public static void numeralComparison() {
    Scanner scanner = new Scanner(System.in);

    System.out.println("Input the first number. Use a comma to indicate decimal points: ");
    double num1 = (double) scanner.nextDouble();
    scanner.nextLine();

    System.out.println("Input the second number: ");
    double num2 = (double) scanner.nextDouble();
    scanner.nextLine();

    if(num1 < num2) {
        System.out.println(num1 + " < " + num2);
    } else if (num2 < num1) {
        System.out.println(num2 + " < " + num1);
    } else {
        System.out.println(num1 + " = " + num2);
    }

    scanner.close();

}

如果我向控制台提供数字“30,0”,它就可以工作。它没有抛出异常。但是,例如,如果我要为它提供“30.0”,它会抛出一个 InputMismatch 异常。

JDK 规范:Corretto 11、IntelliJ IDEA

【问题讨论】:

    标签: java double java.util.scanner mismatch


    【解决方案1】:

    nextDouble 尊重您的区域设置(即使用哪个字符作为小数分隔符)并默认为 Locale.getDefault。但是您可以通过useLocale 告诉Scanner 使用哪个Locale

    由于您正在寻找英式小数,您可以在阅读输入之前设置scanner.useLocale(Locale.ENGLISH)

    public static void numeralComparison() {
        Scanner scanner = new Scanner(System.in);
        scanner.useLocale(Locale.ENGLISH);
    
        System.out.println("Input the first number. Use a comma to indicate decimal points: ");
        double num1 = (double) scanner.nextDouble();
        scanner.nextLine();
    
        System.out.println("Input the second number: ");
        double num2 = (double) scanner.nextDouble();
        scanner.nextLine();
    
        if (num1 < num2) {
            System.out.println(num1 + " < " + num2);
        } else if (num2 < num1) {
            System.out.println(num2 + " < " + num1);
        } else {
            System.out.println(num1 + " = " + num2);
        }
    
        scanner.close();
    }
    

    【讨论】:

    • 感谢您的澄清。欣赏它。但是我仍然有一个问题,即使它与语言环境不匹配,它仍然不应该给出错误。 30.0 不应该仍然处于双重领域吗?我不明白为什么它会接受 300 而不是 30.0,因为它们是一样的。
    • 不确定你的意思。如果不用作小数分隔符,则为“。”通常用作千位分隔符,即写“30.000”而不是“30000”。恕我直言,“30.0”既不有效,也不与“300”相同。
    【解决方案2】:

    听起来像是语言环境问题。扫描仪的语言环境将定义小数点分隔符。例如,如果您想将小数分隔符更改为 . ,请将区域设置更改为使用句点作为小数分隔符的国家/地区。

    例如:

    scanner.useLocale(Locale.CANADA);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-18
      • 1970-01-01
      • 2020-03-31
      • 2011-05-05
      • 2023-02-01
      • 1970-01-01
      • 2010-11-02
      相关资源
      最近更新 更多