使用步骤:
package com.itheima.d14_bigdecimal;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalDemo {
public static void main(String[] args) {
// 浮点型运算的时候直接 + * / 可能会出现数据失真(精度问题)
// 以下运算都失真了,
System.out.println(0.09 + 0.01); //0.09999999999999999
System.out.println(1.0 - 0.32); // 0.6799999999999999
System.out.println(1.015 * 1000); // 1014.9999999999999
System.out.println(1.301 / 100); // 0.013009999999999999
System.out.println("----------------------------");
double a = 0.1;
double b = 0.2;
double c = a + b;
System.out.println(c); //0.30000000000000004
System.out.println("---------------------");
// 包装浮点型数据成为大数据对象 BigDecimal
/**
* 该valueOf方法返回的是一个有参构造器 相当于创建了BigDecimal对象
* return new BigDecimal(Double.toString(val));
*/
BigDecimal a1 = BigDecimal.valueOf(a);
BigDecimal b1 = BigDecimal.valueOf(b);
BigDecimal c1 = a1.add(b1); // 0.3 成功避免了失真问题
System.out.println(c1); // BigDecimal类型是引用类型,应该打印的是地址,这里打印的是数值,所以重写了toString方法
// 目的:double BigDecimal 只是手段,实现double 类型的手段
// double rs1 = c1; // BigDecimal的值,不能直接接收
double rs = c1.doubleValue(); // 将c1的值转换为double类型
System.out.println(rs);
// 注意事项:BigDecimal类型的数据 是一定要精度运算的 的方法divide
BigDecimal a11 = BigDecimal.valueOf(10.0);
BigDecimal b11 = BigDecimal.valueOf(3.0);
// BigDecimal c11 = a11.divide(b11); // 会报错,必须做精度运算
/**
* 参数一:除数 参数二:保留小数位 参数三:舍入模式
*/
BigDecimal c11 = a11.divide(b11,2, RoundingMode.HALF_UP); // 3.3333333
System.out.println(c11); //3.33 保留了两位小数
}
}