BigDecimal金錢類/java計算精度問題
阿新 • • 發佈:2021-01-06
技術標籤:BigDecimaljava
注意:精度問題的原因是計算機的進位制轉換問題導致的,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;
如果喜歡請點贊關注收藏,我是風一樣,用心寫程式碼的傢伙