1. 程式人生 > 其它 >BigDecimal金錢類/java計算精度問題

BigDecimal金錢類/java計算精度問題

技術標籤: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;

如果喜歡請點贊關注收藏,我是風一樣,用心寫程式碼的傢伙