BigDecimal Method returns 模糊的结果,为什么会这样?
BigDecimal Method returns vague results, why does this happen?
代码:
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.
double
由于其使用的精度无法正确处理 0.2
。
尝试这样做来创建数字,您需要使用字符串构造 BigDecimal,这样您就不会遗留 double
精度问题。
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);
引用 BigDecimal(double)
构造函数的 javadoc:
The results of this constructor can be somewhat unpredictable. [...] When a double must be used as a source for a BigDecimal
, [...] use the static valueOf(double)
method.
所以,总是使用 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
代码:
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.
double
由于其使用的精度无法正确处理 0.2
。
尝试这样做来创建数字,您需要使用字符串构造 BigDecimal,这样您就不会遗留 double
精度问题。
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);
引用 BigDecimal(double)
构造函数的 javadoc:
The results of this constructor can be somewhat unpredictable. [...] When a double must be used as a source for a
BigDecimal
, [...] use the staticvalueOf(double)
method.
所以,总是使用 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