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

时间:2015-09-06 01:49:38

标签: 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);
    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;

  }


}

结果:

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

我正在使用Eclipse IDE Mars和Java 1.8。

2 个答案:

答案 0 :(得分:3)

由于double使用的精确度,0.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); 精度问题。

Gaussian mixture models

答案 1 :(得分:2)

引用BigDecimal(double)构造函数的javadoc:

  

这个构造函数的结果可能有些不可预测。 [...]当必须将double用作BigDecimal的来源时,[...]使用静态valueOf(double)方法。

因此,请始终使用BigDecimal.valueOf(double),而不是new BigDecimal(double)

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));

输出

Enter Number 1: 90
Enter Number 2: 10.2
Result: 100.2