【问题标题】:Number types on Scanner扫描仪上的数字类型
【发布时间】:2019-04-04 18:31:21
【问题描述】:

我做了一个简单的程序,根据公式中的 3 个数字计算 delta。但是,它对小数点后的分数和数字有问题(例如 3.33、3/4)。如果我用它代替任何字母,则会出现错误:

线程“主”java.util.InputMismatchException 中的异常 java.base/java.util.Scanner.throwFor(Scanner.java:939) 在 java.base/java.util.Scanner.next(Scanner.java:1594) 在 java.base/java.util.Scanner.nextInt(Scanner.java:2258) 在 java.base/java.util.Scanner.nextInt(Scanner.java:2212) 在 Main.main(Main.java:11)

如何添加补丁以使程序正常运行?我的代码如下:

import java.util.Scanner;
import java.lang.Math;
import java.util.Locale;
public class Main {
    public static void main(String[] args) {
        final double n1; //a
        final double n2; //b
        final double n3; //c
        Scanner reader= new Scanner(System.in).useLocale(Locale.US);
        System.out.print("calculation of the delta. Enter the first number (a from the formula)");
        n1 = reader.nextDouble();
        System.out.print("give the second number (b from the formula)");
        n2 = reader.nextDouble();
        System.out.print("give the last number (c from the formula)");
        n3 = reader.nextDouble();
        final double delta = Math.pow(n2, 2) - 4 * n1 * n3;
        final double d01 = (-n2 + Math.sqrt(delta)) / (2 * n1);
        final double d02 = (-n2 - Math.sqrt(delta)) / (2 * n1);
        final String dinfo = "Delta is equal: ";
        if(delta>0) {
            System.out.println(dinfo + (int)delta + " , has [two] zero places, which is equal to: " + (int)d01 + " and " + (int)d02);
        }
        else if (delta == 0) {
            System.out.println(dinfo + (int)delta + ", has exactly [one] zero place, which is equal to: " + (int)d01);
        }
        else {
            System.out.println(dinfo + (int)delta + ", no zero places.");
        }
    }
}

【问题讨论】:

  • 你在 d01 和 d02 计算什么?
  • 首先将 double 设置为 n1,n2,n3 的类型
  • 我正在计算增量的零位。我已经更改了,但错误仍然出现。
  • 将 n1、n2 和 n3 的类型更改为 double 后,还将 nextInt() 方法更改为 nextDouble() .. 此外,在打印语句中删除强制转换为 int
  • 我已经更新了。没有变化。

标签: java


【解决方案1】:

如果你想接受十进制的输入数字,你应该使用float or double 类型。例如

double n1;
n1 = reader.nextDouble();

关于分数的情况,你应该使用String类型,然后将其转换为数字类型。例如

    String tmp;
    Scanner reader= new Scanner(System.in).useLocale(Locale.US);
    System.out.print("calculation of the delta. Enter the first number (a from the formula)");
    tmp = reader.next();
    n1 = fractionToDouble(tmp);
    tmp = reader.next();
    n2 = fractionToDouble(tmp);
....

添加 fractionToDouble 转换方法。参考:mishadoff's answer

static double fractionToDouble(String ratio) {
        if (ratio.contains("/")) {
            String[] rat = ratio.split("/");
            return Double.parseDouble(rat[0]) / Double.parseDouble(rat[1]);
        } else {
            return Double.parseDouble(ratio);
        }
    }

【讨论】:

  • 更正了 n1、n2、n3。输入小数点后的分数或数字后仍然无效。
  • 你改成nextDouble()了吗
  • 我看你的代码没有问题,能告诉我你的测试数据吗?
  • 我创建了一个示例来更好地解释我的问题。 here
  • 我明白了。如果你想输入例如,你应该参考这篇文章How to convert from fraction formatted string to Decimal or Float in Java?。 “3/3”。
【解决方案2】:

先将int改为double

 final double n1; //a
 final double n2; //b
 final double n3; //c

 n1 = reader.nextDouble();
 n2 = reader.nextDouble();
 n3 = reader.nextDouble();

你需要设置 Locale.us 来解决这个 InputMismatchException。否则,它可能会使用“,”或其他字符作为小数分隔符。这解决了你的小数问题

Scanner reader= new Scanner(System.in).useLocale(Locale.US);

【讨论】:

  • 无变化。我已经更新了帖子中的代码,请看一下。
  • 您的代码不能仅用于分数?我认为别人和十进制数给出正确答案?
  • 我的代码只适用于整数。分数和小数不起作用,这就是问题所在。
猜你喜欢
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
相关资源
最近更新 更多