天天看點

BigDecimal1. BigDecimal 的舍入模式(RoundingMode)2. BigDecimal的運算——加減乘除

文章目錄

  • 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);