注意:精度问题的原因是计算机的进制转换问题导致的,BigDecimal的解决方案是把值放大,进行计算这样精度的误差就会被缩小,另外需要注意的是初始化的值如果不是整数要注意使用String类型的构造方法
//初始化建议用字符串和整数进行入参,不然可能有精度问题
BigDecimal decimalA = new BigDecimal("100");
BigDecimal decimalB = new BigDecimal("20");
BigDecimal decimalC = new BigDecimal("100.123456");
//正常相加
BigDecimal decimalD = decimalA.add(decimalB);
//相加并且设置保留位,包含整数和小数,四舍五入
BigDecimal decimalE = decimalA.add(decimalB, new MathContext(2));
//正常相减
BigDecimal decimalF = decimalA.subtract(decimalB);
//相减并且设置保留位,包含整数和小数,四舍五入
BigDecimal decimalG = decimalA.subtract(decimalB, new MathContext(2));
//正常相乘
BigDecimal decimalQ = decimalA.multiply(decimalB);
//相乘并且设置保留位,包含整数和小数,四舍五入
BigDecimal decimalW = decimalA.multiply(decimalB, new MathContext(2));
//正常相除,如果碰见除不尽的会抛异常
BigDecimal decimalR = decimalA.divide(decimalB);
//相除并且设置保留位,包含整数和小数,四舍五入
BigDecimal decimalT = decimalA.divide(decimalB, new MathContext(4));
//相除并且必须四舍五入掉最后两位非零的小数,可以选择四舍五入的规则,如果只有二位则只四舍五入一位,最少保证一位不为0的小数
BigDecimal decimalY = decimalA.divide(decimalB, 2);
//相除并且这个同上,只是换成了变量名
BigDecimal decimalU = decimalA.divide(decimalB, RoundingMode.UP);
//相除并且指定保留小数的位数,不够补0,可以设置四舍五入规则
BigDecimal decimalI = decimalA.divide(decimalB, 2, 0);
//相除并且这个同上,只是换成了变量名,RoundingMode也可以用BigDecimal
BigDecimal decimalO = decimalA.divide(decimalB, 2, RoundingMode.UP);
//单独指定保留小数位,只能去掉尾部的 0 或者增加 0,如果去非0的会报精度丢失异常
BigDecimal decimalP=decimalR.setScale(10);
//单独指定保留小数的位数,不够补0,可以设置四舍五入规则
BigDecimal decimalS=decimalR.setScale(1, 0);
//单独这个同上,只是换成了变量名,RoundingMode也可以用BigDecimal
BigDecimal decimalH=decimalR.setScale(1, RoundingMode.UP);
//相除得到最大整除数以后的多余的数,如 100.12 -(100.12 / 20)*20
BigDecimal decimalJ=decimalA.remainder(decimalB);
//同上,多了个设置保留位,包含整数和小数,四舍五入
BigDecimal decimalK=decimalA.remainder(decimalB,new MathContext(1));
//相除得到最大整除数,如100.12 / 20
BigDecimal decimalL=decimalA.divideToIntegralValue(decimalB);
//同上,多了个设置保留位,包含整数和小数,四舍五入
BigDecimal decimalZ=decimalA.divideToIntegralValue(decimalB,new MathContext(1));
//相除得到最大整除数和除完多余的数,比如100.12 / 20 得到 5 和 0.12,反推就是N[0]*decimalB+N[1]
BigDecimal[] decimalsA=decimalA.divideAndRemainder(decimalB);
//同上,多了个控制整除数保留位的,四舍五入
BigDecimal[] decimalsB=decimalA.divideAndRemainder(decimalB,new MathContext(1));
//两个值比较,返回大的值
BigDecimal decimalX=decimalA.max(decimalB);
//两个值比较,返回小的值
BigDecimal decimalV=decimalA.min(decimalB);
//比较两个值是否一样相等
boolean type=decimalA.equals(decimalC);
//两个值比较,第一个值小于第二个返回-1,等于返回0 ,大于返回1
int size=decimalA.compareTo(decimalB);
//获取当前对象的值
BigDecimal decimalN=decimalA.abs();
BigDecimal decimalNS=decimalA.plus();
//获取当前对象值的缩写 就是加上 E
BigDecimal decimalHH=decimalA.stripTrailingZeros();
//获取完整值
BigDecimal decimalLL=decimalA.scaleByPowerOfTen(0);
//获取当前对象去了小数点的整数值,只拿可见的值,忽略 E
BigInteger bigIntegerA=decimalA.unscaledValue();
//获取当前对象去了小数点的整数值,不忽略 E
BigInteger bigIntegerB=decimalA.toBigIntegerExact();
//同上,多了个设置保留位,包含整数和小数,四舍五入
BigDecimal decimalM=decimalA.abs(new MathContext(4));
BigDecimal decimalMS=decimalA.plus(new MathContext(4));
BigDecimal decimalRO=decimalA.round(new MathContext(9));
//获取当前对象的值,String类型,三个的区别就是后面两个会用幂等这种科学计数法省略长度
String sdecimalA=decimalA.toPlainString();
String sdecimalB=decimalA.toEngineeringString();
String sdecimalC=decimalA.toString();
//获取当前对象值的反方向值,比如当前值是 100 取出来的就是 -100
BigDecimal decimalAA=decimalA.negate();
//同上,多了个设置保留位,包含整数和小数,四舍五入
BigDecimal decimalBB=decimalA.negate(new MathContext(4));
//向左移动指定位数小数点
BigDecimal decimalCC=decimalA.movePointLeft(1);
//向右移动指定位数小数点
BigDecimal decimalDD=decimalA.movePointRight(1);
//幂等计算,比如 100.pow(3) 就是100*100*100,幂是几,就几个值一次一次相乘
BigDecimal decimalEE=decimalA.pow(3);
//如上,多了个设置保留位,包含整数和小数,四舍五入
BigDecimal decimalFF=decimalA.pow(2,new MathContext(4));
//获取当前对象值的精度(数字长度,不包含小数点)
int precisionA=decimalA.precision();
//获取当前对象值小数点右边的精度(小数长度)
int precisionB=decimalA.scale();
//获取当前对象值的最小精度,比如 值为100 结果就是1 如果带小数比如 1.12 就是0.01
BigDecimal decimalGG=decimalA.ulp();
int decimalJJ=decimalA.signum();
int i = 0;
如果喜欢请点赞关注收藏,我是风一样,用心写代码的家伙