为什么在java中使用scanner类和分隔符来获取double时会得到错误的数学结果?

nvbavucw  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(416)

我正在写一个程序,我必须得到一个用户输入,保存为一个双精度。用户必须能够同时使用“,”和“.”作为分隔符—不管他们想要什么。我尝试使用usedelimiter,它只能部分工作-它确实接受两个值(例如4.5和4,5),但当我后来在数学公式中使用输入的值时,我得到了错误的结果-它似乎将用户输入向下舍入到最接近的整数,并作为一种效果,无论我输入,4或4.5或4,5或4.8等。,我得到了相同的结果,实际上只对4适用。有人知道它为什么不起作用吗?

double protectiveResistor=0;                //must be a double, required by my teacher
  double voltage= 5;    
  System.out.println("Please provide the resistance.");
        Scanner sc= new Scanner(System.in);
        sc.useDelimiter("(\\p{javaWhitespace}|\\.|,)");

        try
        {
            protectiveResistor=sc.nextDouble();
        }
        catch(InputMismatchException exception)
        {
            System.out.println("Wrong input!");
            System.exit(1);
        }

        if (protectiveResistor<0){
            System.err.println("Wrong input!");
            System.exit(1);
        }

        double current = (double)voltage/protectiveResistor;
        double power = (double)current*current*protectiveResistor;

谢谢您!

yqhsw0fo

yqhsw0fo1#

usedelimiter()所做的是分割指定分隔符上的输入。例如,如果您有 4,5 ,以下代码将打印“4”。

Scanner sc= new Scanner(System.in);
sc.useDelimiter(",");
System.out.println(sc.next())

如果您还想打印第二部分,在“,”之后,您需要添加另一行以获得下一个值,在本例中,这将打印“4 5”:

Scanner sc= new Scanner(System.in);
sc.useDelimiter(",");
System.out.println(sc.next())
System.out.println(sc.next())

在代码中,可以这样做:

Scanner sc= new Scanner(System.in);
sc.useDelimiter("(\\p{javaWhitespace}|\\.|,)");

try
{
    String firstPart = "0";
    String secondPart = "0";
    if (sc.hasNext()) {
        firstPart = sc.next();
    }
    if (sc.hasNext()) {
        secondPart = sc.next();
    }
    protectiveResistor = Double.parseDouble(firstPart + "." + secondPart)
}
// Rest of your code here

这段代码所做的是将输入拆分为空格“,”和“,”。对于浮点值,您希望小数点前有一部分,小数点后有一部分。因此,您希望扫描器将输入分成两部分。这两部分被分配给两个变量, firstPart 以及 secondPart . 在最后一步中,这两个部分与“.”一起作为小数点,正如java所期望的那样,并解析回double类型的变量。

ffvjumwh

ffvjumwh2#

这个 useDelimiter 方法是告诉 Scanner 哪个字符能把数字分开。它不是用来指定小数点的字符。如果用户输入 4.5 或者 4,5 ,的 Scanner 将其视为两个独立的输入, 4 以及 5 .
不幸的是 Scanner 无法将两个不同的字符指定为十进制分隔符。你唯一能做的就是分别扫描这两个数字,然后把它们合并成一个十进制数。您将希望将它们扫描为 String 值,这样就不会丢失小数点后的任何零。

lnlaulya

lnlaulya3#

一个简单的方法是用点代替逗号。
演示:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Enter a number: ");
        double x = Double.parseDouble(sc.next().replace(',', '.'));
        System.out.println(x);
    }
}

示例运行:

Enter a number: 12.34
12.34

另一个示例运行:

Enter a number: 12,34
12.34

相关问题