BigDecimal 用法總結

轉載請注明出處:目錄1.BigDecimal 簡介2.構造BigDecimal的對象3.常用方法總結4.divide方法使用5.setScale 方法使用6.BigDecimal 數據庫存儲類型對應 decimal1.BigDecimal 簡介在進行浮點數 long 或 double 類型的運算時,如果直接進行運算 , 浮點數的運算會出現精度失準的情況,特別是在計算和金額相關的運算時,必須計算精確,不能出現誤差 , BigDecimal 的出現就是為了解決 浮點數類型的運算精度失準的場景;
示例:
public static void main(String[] args) {System.out.println(0.2+0.1);System.out.println(0.3-0.1);System.out.println(0.2*0.1);System.out.println(0.3/0.1);}運行后的結果如下:
                              

BigDecimal 用法總結

文章插圖
2.構造BigDecimal的對象BigDecimal提供了豐富的構造函數,可以通過int、long、double、String等來構造一個BigDecimal對象 。
但是,使用double作為參數的構造函數,無法精確構造一個BigDecimal對象,需要自己指定一個上下文的環境,也就是指定精確位 。
BigDecimal bg = new BigDecimal(1.1);System.out.println(bg.toString());運行結果:1.100000000000000088817841970012523233890533447265625所以,通常情況下 , 我們會使用String對象作為參數來構造一個精確的BigDecimal對象 。下面提供的三種方法都是可以的:
【BigDecimal 用法總結】//方法一BigDecimal bg1 = new BigDecimal("1.1");//方法二BigDecimal bg2 = new BigDecimal(Double.toString(1.1));//方法三BigDecimal bg3 = BigDecimal.valueOf(1.1);System.out.println(bg1.toString());System.out.println(bg2.toString());System.out.println(bg3.toString());運行結果:1.11.11.13.常用方法總結
  • add(BigDecimal): BigDecimal對象中的值相加 , 返回BigDecimal對象
  • subtract(BigDecimal): BigDecimal對象中的值相減 , 返回BigDecimal對象
  • multiply(BigDecimal): BigDecimal對象中的值相乘,返回BigDecimal對象
  • divide(BigDecimal): BigDecimal對象中的值相除,返回BigDecimal對象
  • toString(): 將BigDecimal對象中的值轉換成字符串
  • doubleValue(): 將BigDecimal對象中的值轉換成雙精度數
  • floatValue(): 將BigDecimal對象中的值轉換成單精度數
  • longValue(): 將BigDecimal對象中的值轉換成長整數
  • intValue(): 將BigDecimal對象中的值轉換成整數
  • a.max (b) 比較取最大值
  • a.min(b) 比較取最小值
  • a.abs() 取最絕對值
  • negate(): 取相反數
  • (BigDecimal).compareTo(BigDecimal2) : 比較兩個BigDecimal 對象的大?。?返回值為-1,表示bigdemical小于bigdemical2; 返回值為 0,表示bigdemical等于bigdemical2; a = 1,表示bigdemical大于bigdemical2;
4.divide方法使用BigDecimal中的divide主要就是用來做除法的運算 。方法定義如下:
public BigDecimal divide(BigDecimal divisor,int scale, int roundingMode)第一個參數是除數,第二個參數代表保留幾位小數,第三個代表的是使用的模式 。第三個參數可以使用如下常量配置:
BigDecimal.ROUND_DOWN:直接省略多余的小數,比如1.28如果保留1位小數,得到的就是1.2BigDecimal.ROUND_UP:直接進位,比如1.21如果保留1位小數,得到的就是1.3BigDecimal.ROUND_HALF_UP:四舍五入,2.35保留1位,變成2.4BigDecimal.ROUND_HALF_DOWN:四舍五入 , 2.35保留1位,變成2.3后邊兩種的區別就是如果保留的位數的后一位如果正好是5的時候,一個舍棄掉,一個進位 。進行除法運算,并四舍五入
System.out.println(new BigDecimal("2322").divide(new BigDecimal("209.123345456667"),2, BigDecimal.ROUND_HALF_UP));執行結果為 :11.10
5.setScale 方法使用setScale(1)表示保留一位小數,默認用四舍五入方式
setScale(1)表示保留一位小數,默認用四舍五入方式setScale(1,BigDecimal.ROUND_DOWN)直接刪除多余的小數位,如2.35會變成2.3setScale(1,BigDecimal.ROUND_UP)進位處理,2.35變成2.4setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35變成2.4setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35變成2.3,如果是5則向下舍示例:
double dou = 3.14789;//BigDecimal.ROUND_UP 四舍五入//BigDecimal.ROUND_DOWN 直接舍棄保留位數之后小數BigDecimal bigDecimal = new BigDecimal(dou).setScale(2, BigDecimal.ROUND_DOWN);double newDouble = bigDecimal.doubleValue();System.out.println("newDouble:" + newDouble);注: 1、BigDecimal.ROUND_UP 四舍五入 , BigDecimal.ROUND_DOWN 直接舍棄保留位數之后小數; 2、位數不夠時,不會補齊

推薦閱讀