文章目錄
- 1. BigDecimal 的舍入模式(RoundingMode)
-
- 1.1 ROUND_UP
- 1.2 ROUND_DOWN
- 1.3 ROUND_HALF_UP
- 1.4 ROUND_HALF_DOWN
- 1.5 ROUND_CEILING
- 1.6 ROUND_FLOOR
- 1.7 ROUND_HALF_EVEN
- 1.8 ROUND_UNNECESSARY
- 2. BigDecimal的運算——加減乘除
-
- 2.1 加法 add()函數 減法subtract()函數 乘法multiply()函數 除法divide()函數 絕對值abs()函數
1. BigDecimal 的舍入模式(RoundingMode)
BigDecimal 有 8 種 RoundingMode(舍入模式)
1.1 ROUND_UP
進位制:不管保留數字後面是大是小 (0 除外) 都會進 1。結果會向原點的反方向對齊,正數向正無窮方向對齊,負數向負無窮方向對齊。
BigDecimal a = new BigDecimal("0.098").setScale(2, BigDecimal.ROUND_UP); // 0.10
BigDecimal b = new BigDecimal("0.094").setScale(2, BigDecimal.ROUND_UP); // 0.10
BigDecimal c = new BigDecimal("-0.098").setScale(2, BigDecimal.ROUND_UP); // -0.10
BigDecimal d = new BigDecimal("-0.094").setScale(2, BigDecimal.ROUND_UP); // -0.10
BigDecimal e = new BigDecimal("-0.090").setScale(2, BigDecimal.ROUND_UP); // -0.09
BigDecimal f = new BigDecimal("0.090").setScale(2, BigDecimal.ROUND_UP); // 0.09
1.2 ROUND_DOWN
舍去制: 截斷操作,後面所有數字直接去除。結果會向原點方向對齊。
BigDecimal a = new BigDecimal("0.098").setScale(2, BigDecimal.ROUND_DOWN); // 0.09
BigDecimal b = new BigDecimal("0.094").setScale(2, BigDecimal.ROUND_DOWN); // 0.09
BigDecimal c = new BigDecimal("-0.098").setScale(2, BigDecimal.ROUND_DOWN); // -0.09
BigDecimal d = new BigDecimal("-0.094").setScale(2, BigDecimal.ROUND_DOWN); // -0.09
BigDecimal e = new BigDecimal("-0.090").setScale(2, BigDecimal.ROUND_DOWN); // -0.09
BigDecimal f = new BigDecimal("0.090").setScale(2, BigDecimal.ROUND_DOWN); // 0.09
1.3 ROUND_HALF_UP
根據保留數字後一位 >=5 進行四舍五入。如果舍棄部分的最高位大于等于 5,向原點反方向對齊,否則向原點方向對齊。
BigDecimal a = new BigDecimal("0.095").setScale(2, BigDecimal.ROUND_HALF_UP); // 0.10
BigDecimal b = new BigDecimal("0.094").setScale(2, BigDecimal.ROUND_HALF_UP); // 0.09
BigDecimal c = new BigDecimal("-0.095").setScale(2, BigDecimal.ROUND_HALF_UP); // -0.10
BigDecimal d = new BigDecimal("-0.094").setScale(2, BigDecimal.ROUND_HALF_UP); // -0.09
BigDecimal e = new BigDecimal("-0.090").setScale(2, BigDecimal.ROUND_HALF_UP); // -0.09
BigDecimal f = new BigDecimal("-0.098").setScale(2, BigDecimal.ROUND_HALF_UP); // -0.10
1.4 ROUND_HALF_DOWN
根據保留數字後一位 >5 進行五舍六入。如果舍棄部分的最高位大于 5,向原點反方向對齊,否則向原點方向對齊。這種模式也就是我們常說的 “五舍六入”。
BigDecimal a = new BigDecimal("0.096").setScale(2, BigDecimal.ROUND_HALF_DOWN); // 0.10
BigDecimal b = new BigDecimal("0.095").setScale(2, BigDecimal.ROUND_HALF_DOWN); // 0.09
BigDecimal c = new BigDecimal("-0.096").setScale(2, BigDecimal.ROUND_HALF_DOWN); // -0.10
BigDecimal d = new BigDecimal("-0.095").setScale(2, BigDecimal.ROUND_HALF_DOWN); // -0.09
BigDecimal e = new BigDecimal("-0.094").setScale(2, BigDecimal.ROUND_HALF_DOWN); // -0.09
1.5 ROUND_CEILING
向正無窮方向對齊,轉換為正無窮方向最接近的數值。如果為正數,行為和 ROUND_UP 一樣;如果為負數,行為和 ROUND_DOWN 一樣。此模式不會減少數值大小。
BigDecimal a = new BigDecimal("0.098").setScale(2, BigDecimal.ROUND_CEILING); // 0.10
BigDecimal b = new BigDecimal("0.094").setScale(2, BigDecimal.ROUND_CEILING); // 0.10
BigDecimal c = new BigDecimal("-0.098").setScale(2, BigDecimal.ROUND_CEILING); // -0.09
BigDecimal d = new BigDecimal("-0.094").setScale(2, BigDecimal.ROUND_CEILING); // -0.09
BigDecimal e = new BigDecimal("-0.090").setScale(2, BigDecimal.ROUND_CEILING); // -0.09
BigDecimal f = new BigDecimal("0.090").setScale(2, BigDecimal.ROUND_CEILING); // 0.09
1.6 ROUND_FLOOR
向負無窮方向對齊。如果為正數,行為和 ROUND_DOWN 一樣;如果為負數,行為和 ROUND_UP 一樣。此模式不會增加數值大小。
BigDecimal a = new BigDecimal("0.098").setScale(2, BigDecimal.ROUND_FLOOR); // 0.09
BigDecimal b = new BigDecimal("0.094").setScale(2, BigDecimal.ROUND_FLOOR); // 0.09
BigDecimal c = new BigDecimal("-0.098").setScale(2, BigDecimal.ROUND_FLOOR); // -0.10
BigDecimal d = new BigDecimal("-0.094").setScale(2, BigDecimal.ROUND_FLOOR); // -0.10
BigDecimal e = new BigDecimal("-0.090").setScale(2, BigDecimal.ROUND_FLOOR); // -0.09
BigDecimal f = new BigDecimal("0.090").setScale(2, BigDecimal.ROUND_FLOOR); // 0.09
1.7 ROUND_HALF_EVEN
四舍六入五成雙,如果舍棄部分的最高位大于等于六,或等于五并且前一位是奇數,向原點反方向對齊,否則向原點方向對齊。
如果舍棄部分左邊的數字為奇數,則作 ROUND_HALF_UP;如果為偶數,則作 ROUND_HALF_DOWN。
BigDecimal a = new BigDecimal("0.095").setScale(2, BigDecimal.ROUND_HALF_EVEN); // 0.10
BigDecimal b = new BigDecimal("0.094").setScale(2, BigDecimal.ROUND_HALF_EVEN); // 0.09
BigDecimal c = new BigDecimal("-0.095").setScale(2, BigDecimal.ROUND_HALF_EVEN); // -0.10
BigDecimal d = new BigDecimal("-0.094").setScale(2, BigDecimal.ROUND_HALF_EVEN); // -0.09
BigDecimal e = new BigDecimal("-0.085").setScale(2, BigDecimal.ROUND_HALF_EVEN); // -0.08
BigDecimal f = new BigDecimal("-0.084").setScale(2, BigDecimal.ROUND_HALF_EVEN); // -0.08
BigDecimal g = new BigDecimal("-0.086").setScale(2, BigDecimal.ROUND_HALF_EVEN); // -0.09
1.8 ROUND_UNNECESSARY
斷言請求的操作具有精确的結果,是以不需要舍入。如果對獲得非精确結果的操作指定此舍入模式,則抛出 ArithmeticException。
2. BigDecimal的運算——加減乘除
首先是bigdecimal的初始化
BigDecimal num1 = new BigDecimal(0.005);
BigDecimal num2 = new BigDecimal(1000000);
BigDecimal num3 = new BigDecimal(-1000000);
//盡量用字元串的形式初始化
BigDecimal num12 = new BigDecimal("0.005");
BigDecimal num22 = new BigDecimal("1000000");
BigDecimal num32 = new BigDecimal("-1000000");
2.1 加法 add()函數 減法subtract()函數 乘法multiply()函數 除法divide()函數 絕對值abs()函數
//加法
BigDecimal result1 = num1.add(num2);
BigDecimal result12 = num12.add(num22);
//減法
BigDecimal result2 = num1.subtract(num2);
BigDecimal result22 = num12.subtract(num22);
//乘法
BigDecimal result3 = num1.multiply(num2);
BigDecimal result32 = num12.multiply(num22);
//絕對值
BigDecimal result4 = num3.abs();
BigDecimal result42 = num32.abs();
//除法
BigDecimal result5 = num2.divide(num1,20,BigDecimal.ROUND_HALF_UP);
BigDecimal result52 = num22.divide(num12,20,BigDecimal.ROUND_HALF_UP);