BigDecimal
public class TestBigDecimal {
public static void main(String[] args) {
double d1 = 1.0;
double d2 = 0.9;
System.out.println(d1 - d2); // 0.09999999999999998
// 面试题
double result = (1.4 - 0.5) / 0.9;
System.out.println(result); // 0.9999999999999999
}
}
很多实际应用中需要精确存储, 而 double
是近似值存储, 不再符合要求, 需要借助 BigDecimal
.
-
位置: java.math 包中
-
作用: 精确计算浮点数
-
创建方式
BigDecimal bd = new BigDecimal("1.0");
示例:
public class TestBigDecimal {
public static void main(String[] args) {
BigDecimal bd1 = new BigDecimal("1.0");
BigDecimal bd2 = new BigDecimal("0.9");
// 减法
BigDecimal r1 = bd1.subtract(bd2);
BigDecimal r2 = bd2.subtract(bd1);
System.out.println(r1); // 0.1
System.out.println(r2); // -0.1
// 加法
BigDecimal r3 = bd1.add(bd2);
System.out.println(r3); // 1.9
// 乘法
BigDecimal r4 = bd1.multiply(bd2);
System.out.println(r4); // 0.90
// 除法
BigDecimal r5 = new BigDecimal("1.4").subtract(new BigDecimal("0.5"))
.divide(new BigDecimal("0.9"));
System.out.println(r5); // 1
}
}
除不尽的情况会报异常, 需要指定保留多少位小数
public class TestBigDecimal {
public static void main(String[] args) {
// 1.0/0.3
BigDecimal result = new BigDecimal("1.0").divide(new BigDecimal("0.3"), 2, RoundingMode.HALF_UP);
System.out.println(result); // 3.33
// 20/3
BigDecimal result2 = new BigDecimal("20").divide(new BigDecimal("3"), 2, RoundingMode.HALF_UP);
System.out.println(result2); // 6.67
}
}