Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BigDecimal方法返回模糊的结果,为什么会发生这种情况?_Java_Eclipse_Double_Java.util.scanner_Bigdecimal - Fatal编程技术网

Java BigDecimal方法返回模糊的结果,为什么会发生这种情况?

Java BigDecimal方法返回模糊的结果,为什么会发生这种情况?,java,eclipse,double,java.util.scanner,bigdecimal,Java,Eclipse,Double,Java.util.scanner,Bigdecimal,代码: 结果: package tk.vivekpatani.www; import java.math.BigDecimal; import java.util.Scanner; public class SimpleCalc { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); t

代码:

结果:

package tk.vivekpatani.www;

import java.math.BigDecimal;
import java.util.Scanner;

public class SimpleCalc {

  public static void main(String[] args) {


    // TODO Auto-generated method stub
    Scanner sc = new Scanner(System.in);
    try{
    System.out.println("Welcome to the Calculator!");


    System.out.println("Enter Number 1:");
    double num1 = sc.nextDouble();

    System.out.println("Enter Number 2:");
    double num2 = sc.nextDouble();

    BigDecimal bd1 = new BigDecimal(num1);
    BigDecimal bd2 = new BigDecimal(num2);

    BigDecimal result = addition(bd1,bd2);

    System.out.println("Result:"+result.toString());
    }
    finally{
      sc.close();
    }

  }
  static BigDecimal addition(BigDecimal input1, BigDecimal input2){

    BigDecimal result = input1.add(input2);
    return result;

  }


}

我正在使用EclipseIDEMars和Java1.8。

由于使用的精度,
double
无法正确处理
0.2

尝试这样做来创建数字,您需要使用字符串构造BigDecimal,这样您就不会带来
double
精度问题

Welcome to the Calculator!
Enter Number 1:
90
Enter Number 2:
10.2
Result:100.199999999999999289457264239899814128875732421875

引用构造函数的javadoc:

此构造函数的结果可能有些不可预测。[…]当双精度必须用作
BigDecimal
的源时,[…]使用static
valueOf(double)
方法

因此,请始终使用
BigDecimal.valueOf(double)
,切勿
新建BigDecimal(double)

输出

输入数字1:90
输入数字2:10.2
结果:100.2

答案与模糊相反。事实上,它太精确了。像往常一样,这个解释很好。简短的回答:不要从一个double创建一个BigDecimal。好的,我会记住的!我读过关于浮动和双重原始不一致性的文章,很有魅力。谢谢你,谢谢你,这是很有用的。我会记住这一点。
    System.out.println("Enter Number 1:");
    String num1 = sc.nextLine();
    BigDecimal bd1 = new BigDecimal(num1);

    System.out.println("Enter Number 2:");
    String num2 = sc.nextLine();
    BigDecimal bd2 = new BigDecimal(num2);
Scanner sc = new Scanner(System.in);

System.out.print("Enter Number 1: ");
double num1 = sc.nextDouble();

System.out.print("Enter Number 2: ");
double num2 = sc.nextDouble();

BigDecimal bd1 = BigDecimal.valueOf(num1);
BigDecimal bd2 = BigDecimal.valueOf(num2);

System.out.println("Result: " + bd1.add(bd2));