先来看一段代码 :
public static void main(String[] args) {
//面试题
double res = (1.4-0.5)/0.9;
System.out.println(res);
}
(1.4 - 0.5) / 0.9 显然等于1 ,但是在程序中结果却是0.9999999999999999
为什么?
double是近似值存储!(比如:double类型的1.0,实际存储可能是0.9999999999)
怎么办?
借助BigDecimal
BigDecimal
- 位置:java.math中。
- 作用:精确计算浮点数。
- 创建方式:BigDecimal bd = new BigDecimal(“1.0”);
public static void main(String[] args) {
//面试题
double res = (1.4-0.5)/0.9;
System.out.println(res);
//使用BigDecimal
BigDecimal bd1 = new BigDecimal("1.4");
BigDecimal bd2 = new BigDecimal("0.5");
BigDecimal bd3 = new BigDecimal("0.9");
BigDecimal result1 = (bd1.subtract(bd2).divide(bd3));
System.out.println(result1);
//链式使用
BigDecimal result2 =(new BigDecimal("1.4"))
.subtract(new BigDecimal("0.5"))
.divide(new BigDecimal("0.9"));
System.out.println(result2);
//除不尽的情况 - 可以在divide中设置保留小数位数以及保留规则(四舍五入或其他)
BigDecimal result3 = (new BigDecimal("20"))
.divide(new BigDecimal("3"), 3, BigDecimal.ROUND_HALF_UP);
System.out.println(result3);
}
结果为:
0.9999999999999999
1
1
6.667
- 加:BigDecimal add(BigDecimal bd)
- 减:BigDecimal subtract(BigDecimal bd)
- 乘:BigDecimal multiply(BigDecimal bd)
- 除:BigDecimal divide(BigDecimal bd)
(进行除法运算的时候,抛出错误!如果不能准确的计算出结果时需要制定保留的位数和取舍方式)
知识点总结自bilibili(Java学习营)视频链接