在程序中执行下列代码,会出现什么问题?
System.out.println(0.09 + 0.01);
System.out.println(1.0 - 0.32);
System.out.println(1.015 * 100);
System.out.println(1.301 / 100);
double和float类型在运算中很容易丢失精度,造成数据的不准确性,Java提供我们BigDecimal类可以实现浮点数据的高精度运算
构造方法如下:
建议浮点数据以字符串形式给出,因为参数结果是可以预知的
实现加法减法乘法代码如下:
public static void main(String[] args) {
//大数据封装为BigDecimal对象
BigDecimal big1 = new BigDecimal("0.09");
BigDecimal big2 = new BigDecimal("0.01");
//add实现加法运算
BigDecimal bigAdd = big1.add(big2);
BigDecimal big3 = new BigDecimal("1.0");
BigDecimal big4 = new BigDecimal("0.32");
//subtract实现减法运算
BigDecimal bigSub = big3.subtract(big4);
BigDecimal big5 = new BigDecimal("1.105");
BigDecimal big6 = new BigDecimal("100");
//multiply实现乘法运算
BigDecimal bigMul = big5.multiply(big6);
对于浮点数据的除法运算,和整数不同,可能出现无限不循环小数,因此需要对所需要的位数进行保留和选择舍入模式
/*
* BigDecimal实现除法运算
* divide(BigDecimal divisor, int scale, int roundingMode)
* int scale:保留几位小数
* int roundingMode:保留模式
* 保留模式 阅读API文档
* static int ROUND_UP 向上+1
* static int ROUND_DOWN 直接舍去
* static int ROUND_HALF_UP >=0.5 向上+1
* static int ROUND_HALF_DOWN > 0.5 向上+1,否则直接舍去
*/
BigDecimal big7 = new BigDecimal("1.601");
BigDecimal big8 = new BigDecimal("100");
BigDecimal bigDiv1 = big7.divide(big8,2,BigDecimal.ROUND_UP);
BigDecimal bigDiv2 = big7.divide(big8,2,BigDecimal.ROUND_DOWN);
BigDecimal bigDiv3 = big7.divide(big8,2,BigDecimal.ROUND_HALF_UP);
BigDecimal bigDiv4 = big7.divide(big8,2,BigDecimal.ROUND_HALF_DOWN);