Java基础-BigDecimal

233 阅读1分钟

为什么使用BigDecimal

  • 关于浮点数在计算机是无法准确表示的,例如,0.1 只能表示一个近似值
  • 浮点数double和float的计算结果偶尔会出现不确定性
public class BigDecimalStudy {
    public static void main(String[] args) {
        double num1 = 0.000001;
        // 实际结果是 9.999999999999999E-5,而不是0.0001
        System.out.println(num1 * 100);  
    }
}

double和float并不适合精确的计算,比较两个值是否相等,不能直接使用==,而是比较差值是否在一个极小的范围内。在商业计算中需要精确的计算,需要使用java.math.BigDecimal

BigDecimal简介

  • BigDecimal的构造方法有很多,但最好使用new BigDecimal(String val)
public class BigDecimalStudy {
    public static void main(String[] args) {
        BigDecimal a = new BigDecimal("1.0");
        System.out.println(a);  // 1.0
        BigDecimal b = new BigDecimal(12.2);
        System.out.println(b); // 12.199999999999999289457264
    }
}
  • BigDecimal的加减乘除
public class BigDecimalStudy {
    public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("0.001");
        System.out.println(num1.multiply(new BigDecimal("100"))); // 0.100
        System.out.println(num1.divide(new BigDecimal("100"))); // 0.00001
        System.out.println(num1.add(new BigDecimal("100"))); // 100.001
        System.out.println(num1.subtract(new BigDecimal("100"))); // -99.999
    }
}
  • BigDecimal的比较大小
public class BigDecimalStudy {
    public static void main(String[] args) {
    	BigDecimal a = new BigDecimal("1.0");
        BigDecimal b = new BigDecimal("1.0");
        System.out.println(a.equals(b)); // true
        System.out.println(a.compareTo(b)); // 0
        BigDecimal num1 = new BigDecimal("100.01");
        System.out.println(num1.compareTo(new BigDecimal("100")) == 1);  // a > b
        System.out.println(num1.compareTo(new BigDecimal("100.01")) == 0); // a = b
        System.out.println(num1.compareTo(new BigDecimal("100.02")) == -1); // a < b
    }
}
  • 保留小数位
public static void main(String[] args) {
    BigDecimal a = new BigDecimal("1.23519");
    // 保留两位小数, 舍弃小数策略  四舍五入 5舍弃
    BigDecimal b = a.setScale(2, BigDecimal.ROUND_HALF_DOWN);
    System.out.println(b); // 1.24
    // 往下取舍
    BigDecimal c = a.setScale(2, BigDecimal.ROUND_DOWN);
    System.out.println(c); // 1.23
    // 往上取舍
    BigDecimal d = a.setScale(2, BigDecimal.ROUND_UP);
    System.out.println(d); // 1.24
}