小数计算不准确——java-API之BigDecimal类
BigDecimal类
概念
java中存在浮点数运算时会出现不精确的问题,这时BigDecimal工具类就可以解决此问题。
BigDecimal继承于Number类。
public class BigDecimalextends Number
创建对象
- BigDecimal(double val) 将 double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式。
double num1 = new Scanner(System.in).nextDouble();
BigDecimal bd = new BigDecimal(num1);
- BigDecimal(String val) 将 BigDecimal 的字符串表示形式转换为 BigDecimal。推荐使用,因为double计算不准确
double num1 = new Scanner(System.in).nextDouble();
BigDecimal bd = new BigDecimal(num + "");
测试
import java.math.BigDecimal;
import java.util.Scanner;
public class Test1_Decimal {
public static void main(String[] args) {
doubleCompute(); // 浮点数计算不准确
bigDecimalCompute(); //BigDecimal 解决小数不准确问题
}
/*
* 输入8.8和5.2
* 打印结果正常
*/
private static void bigDecimalCompute() {
// 接收用户输入的值
double num1 = new Scanner(System.in).nextDouble();
double num2 = new Scanner(System.in).nextDouble();
// 浮点数计算不准确,解决方案 BigDecimal
// 温馨提示:最好不要用double的构造方法,最好用String的构造方法
BigDecimal bd1 = new BigDecimal(num1 + "");
BigDecimal bd2 = new BigDecimal(num2 + "");
BigDecimal bd3;
bd3 = bd1.add(bd2); // 加法运算
System.out.println(bd3);
bd3 = bd1.subtract(bd2); // 减法运算
System.out.println(bd3);
bd3 = bd1.multiply(bd2); // 乘法运算
System.out.println(bd3);
// db3 = bd1.divide(bd2); //除法运算,除不尽会出现异常:java.lang.ArithmeticException
//divide(x,y,z) x是被除的对象 y表示保留的小数位数,z是保留默认通常选择四舍五入。
bd3 = bd1.divide(bd2,3,BigDecimal.ROUND_HALF_UP);
System.out.println(bd3);
}
/*
* 输入8.8和5.2
* 打印结果不准确
*/
private static void doubleCompute() {
// 接收用户输入的值
double num1 = new Scanner(System.in).nextDouble();
double num2 = new Scanner(System.in).nextDouble();
// 运算 结果不准确
System.out.println(num1 + num2); // 14.0
System.out.println(num1 - num2); // 3.6000000000000005
System.out.println(num1 * num2); // 45.760000000000005
System.out.println(num1 / num2); // 1.6923076923076923
}
}

浙公网安备 33010602011771号