BigDecimal 方法使用
生活随笔
收集整理的這篇文章主要介紹了
BigDecimal 方法使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 創建
/**
* 1 創建
*/
//new 對象
BigDecimal a = new BigDecimal("3");
// 內部靜態
BigDecimal b = BigDecimal.valueOf(23L);
BigDecimal c = BigDecimal.ONE;
BigDecimal d = BigDecimal.TEN;
BigDecimal e = BigDecimal.ZERO;
2 加減乘除
/**
* 1 創建
*/
//new 對象
BigDecimal a = new BigDecimal("3");
// 內部靜態
BigDecimal b = BigDecimal.valueOf(23L);
BigDecimal c = BigDecimal.ONE;
BigDecimal d = BigDecimal.TEN;
BigDecimal e = BigDecimal.ZERO;
/**
* 2 加減乘除 精度(除不盡情況報異常) 一般配合 scale方法+舎入方法
*/
//加法 去2位小數
BigDecimal add = b.add(a).setScale(2, BigDecimal.ROUND_HALF_UP);
// 減法 取1位小數
BigDecimal subtract = b.subtract(a).setScale(1, BigDecimal.ROUND_HALF_DOWN);
// 乘法 取3位小數
BigDecimal multiplyA = b.multiply(a).setScale(3, BigDecimal.ROUND_FLOOR);
// 除法 取兩位小數 divideA 寫法是錯誤的 先➗ 除不盡就已經報異常了
//BigDecimal divideA = b.divide(a).setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal divideB = b.divide(a, 2, BigDecimal.ROUND_HALF_UP);
3 舎入模式
3.1ROUND_UP 向上取整
3.2 ROUND_DOWN 向下取整
3.3 ROUND_HALF_UP 四舍五入
3.4ROUND_HALF_DOWN 五舍六入
3.5ROUND_FLOOR 負無窮
3.6ROUND_CEILING 正無窮
3.7ROUND_HALF_EVEN 銀行家舎入法
3.8 ROUND_UNNECESSARY不需要舎入
4 組合使用
這里靈活多變,自己運用得當。
5 方法
5.1 相等
equals :比較精度
compareTo:不比較精度 (一般用這個)
5.2 max 最大值
5.3 min 最小值
5.4 pow 冪
5.5round
5.6 abs 絕對值
5.7 小數點移動
5.8 negate 取反
5.9 plus
round 調用的就是plus
5.10 ulp
6 轉換
摘:測試代碼
public static void main(String[] args) {
/**
* 1 創建
*/
//new 對象
BigDecimal a = new BigDecimal("3");
// 內部靜態
BigDecimal b = BigDecimal.valueOf(23L);
BigDecimal c = BigDecimal.ONE;
BigDecimal d = BigDecimal.TEN;
BigDecimal e = BigDecimal.ZERO;
/**
* 2 加減乘除 精度(除不盡情況報異常) 一般配合 scale方法+舎入方法
*/
//加法 去2位小數
BigDecimal add = b.add(a).setScale(2, BigDecimal.ROUND_HALF_UP);
// 減法 取1位小數
BigDecimal subtract = b.subtract(a).setScale(1, BigDecimal.ROUND_HALF_DOWN);
// 乘法 取3位小數
BigDecimal multiplyA = b.multiply(a).setScale(3, BigDecimal.ROUND_FLOOR);
// 除法 取兩位小數 divideA 寫法是錯誤的 先➗ 除不盡就已經報異常了
//BigDecimal divideA = b.divide(a).setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal divideB = b.divide(a, 2, BigDecimal.ROUND_HALF_UP);
/**
* RoundingMode 舍入模式 8種 小數取舍測試
*/
BigDecimal f = BigDecimal.valueOf(10);
BigDecimal g = BigDecimal.valueOf(3);
//小數位向上取整 3.333 -> 3.34
BigDecimal divide1 = f.divide(g, 2, BigDecimal.ROUND_UP);
//小數向下取整 3.333 -> 3.33
BigDecimal divide2 = f.divide(g, 2, BigDecimal.ROUND_DOWN);
//小數 四舍五入 3.333 -> 3.33
BigDecimal divide3 = f.divide(g, 2, BigDecimal.ROUND_HALF_UP);
/**
* 小數 五舍六入
* 0.5 ->0 divide4=0
* 0.555 ->0.5 divide5=0.5
*/
BigDecimal k = BigDecimal.valueOf(0.5);
BigDecimal m = BigDecimal.valueOf(0.555);
BigDecimal l = BigDecimal.valueOf(1);
BigDecimal divide4 = k.divide(l, 0, BigDecimal.ROUND_HALF_DOWN);
BigDecimal divide5 = m.divide(l, 2, BigDecimal.ROUND_HALF_DOWN);
BigDecimal n = BigDecimal.valueOf(0.555);
BigDecimal o = BigDecimal.valueOf(1);
BigDecimal j = BigDecimal.valueOf(-0.555);
/**
* 正數 數字部分-向下取整 ROUND_UP 0.555 -> 0.55 divide6=0.55
* 負數 數字部分-向上取整 ROUND_DOWN -0.555 -> -0.56 divide7=-0.56
* 不管怎么取 最后的數往小的取 負無窮模式
*/
BigDecimal divide6 = n.divide(o, 2, BigDecimal.ROUND_FLOOR);
BigDecimal divide7 = j.divide(o, 2, BigDecimal.ROUND_FLOOR);
/**
*正數 數字部分-向上取整 ROUND_UP 0.555 -> 0.56 divide6=0.56
*負數 數字部分-向下取整 ROUND_DOWN -0.555 -> -0.55 divide7=-0.55
* 不管怎么取 最后的數往大的取 正無窮模式
*/
BigDecimal divide8 = n.divide(o, 2, BigDecimal.ROUND_CEILING);
BigDecimal divide9 = j.divide(o, 2, BigDecimal.ROUND_CEILING);
/**
* 銀行家舎入法
* 這里取兩位小數
* *小數第二位是奇數 四舍五入 ROUND_HALF_UP (四舍) 0.554 -> 0.55 divide11 =0.55
*小數第二位是奇數 四舍五入 ROUND_HALF_UP (五入) 0.555 -> 0.56 divide10 =0.56
*
* 小數第二位是偶數 五舍六入 ROUND_HALF_DOWN (五舍) 0.565 -> 0.56 divide12 =0.56
* 小數第二位是偶數 五舍六入 ROUND_HALF_DOWN (六入)0.566 -> 0.57 divide13 =0.57
*/
BigDecimal x = BigDecimal.valueOf(0.555);
BigDecimal r = BigDecimal.valueOf(0.554);
BigDecimal z = BigDecimal.valueOf(0.565);
BigDecimal s = BigDecimal.valueOf(0.566);
BigDecimal y = BigDecimal.valueOf(1);
BigDecimal divide10 = x.divide(y, 2, BigDecimal.ROUND_HALF_EVEN);
BigDecimal divide11 = r.divide(y, 2, BigDecimal.ROUND_HALF_EVEN);
BigDecimal divide12 = z.divide(y, 2, BigDecimal.ROUND_HALF_EVEN);
BigDecimal divide13 = s.divide(y, 2, BigDecimal.ROUND_HALF_EVEN);
/**
*精確值 不需要舎入 有精度會報錯 divide14 會報錯
*/
//BigDecimal divide14 = s.divide(y, 2, BigDecimal.ROUND_UNNECESSARY);
BigDecimal divide14 = s.divide(y,BigDecimal.ROUND_UNNECESSARY);
/**
* 組合使用
* 例如:(a*b)/(10-c) + d
*/
BigDecimal add1 = a.multiply(b).divide(BigDecimal.TEN.subtract(c), 2, BigDecimal.ROUND_UP).add(d);
/**
* 轉換string bigA
* toPlainString:0.0000000007755443848456408430750165156389829002048230677246465347707271575927734375
* toString: 7.755443848456408430750165156389829002048230677246465347707271575927734375E-10
* toString() 科學計數法
*/
BigDecimal bigA = new BigDecimal(Math.pow(0.5671, 25));
BigDecimal bigB = new BigDecimal(Math.pow(0.5671, 25));
BigDecimal bigD = new BigDecimal(2);
/**
* 比較
* equals :比較精度
* compareTo:不比較精度 (一般用這個)
* 至于為什么兩個equals 會有不同的值 已經提示了
*/
BigDecimal bigC = new BigDecimal(1.2);
BigDecimal bigE = new BigDecimal(1.20000000);
boolean equals = bigE.equals(bigC);
//true
System.out.println(bigE.equals(bigC));
System.out.println(bigE.compareTo(bigC));
BigDecimal z1 = new BigDecimal("0");
BigDecimal z2 = new BigDecimal("0.0");
//false
System.out.println(z1.equals(z2));
System.out.println(z1.compareTo(z2));
//兩數 取最大
BigDecimal max = bigD.max(bigC);
//兩數 取最小
BigDecimal min = bigD.min(bigC);
//n次冪 4
BigDecimal pow = bigD.pow(2);
// 四舍五入 2.345 -> 2.3 round=2.3
BigDecimal bigF = new BigDecimal(2.345);
MathContext math = new MathContext(2);
BigDecimal round = bigF.round(math);
//絕對值 -23 -> 23
BigDecimal bigG = new BigDecimal("-23");
BigDecimal abs = bigG.abs();
/**
* movePointLeft 小數點左移
* movePointRight 小數點右移
*/
BigDecimal bigH = new BigDecimal("23.4567");
BigDecimal bigDecimal = bigH.movePointLeft(1);
BigDecimal bigDecimal1 = bigH.movePointRight(1);
/**
* 取反 23.4567 -> -23.4567
*/
BigDecimal negate = bigH.negate();
/**
* 跟round 一樣 底層都是plus
*/
MathContext math1 = new MathContext(3);
BigDecimal plus = bigH.plus(math1);
System.out.println(plus);
/**
* ulp
* 返回最后一位的位置 都是1
* 231212 -> 1
* 2.31212 -> 0.00001
*/
BigDecimal bigK = new BigDecimal("231212");
BigDecimal bigO = new BigDecimal("2.31212");
BigDecimal ulp = bigO.ulp();
System.out.println(ulp);
/**
* 6 轉換
*/
BigDecimal bigP = new BigDecimal("2312");
bigP.doubleValue();
bigP.longValue();
bigP.intValue();
bigP.byteValue();
bigP.shortValue();
bigP.byteValue();
/**
* toString 數字過長 會采用 科學計數法
* toPlainString 這個正常顯示
*/
bigP.toString();
bigP.toPlainString();
}
總結
以上是生活随笔為你收集整理的BigDecimal 方法使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文件 云存储服务器配置,文件和存储服务器
- 下一篇: WGS84 GCJ02 BD09 地