float和double類型的主要設計目標是爲了科學計算和工程計算。他們執行二進制浮點運算,這是爲了在廣域數值範圍上提供較爲精確的快速近似計算而精心設計的。然而,它們沒有提供徹底精確的結果,因此不該該被用於要求精確結果的場合。可是,商業計算每每要求結果精確,這時候就應該使用BigDecimal。java
public static void main(String[] args) { BigDecimal bigDecimal = new BigDecimal(2); BigDecimal bDouble = new BigDecimal(2.3); BigDecimal bString = new BigDecimal("2.3"); System.out.println("bigDecimal=" + bigDecimal);//輸出:bigDecimal=2 System.out.println("bDouble=" + bDouble);//輸出:bDouble=2.9999999 System.out.println("bString=" + bString);//輸出:bString=2.3 }
參數類型爲double的構造方法的結果有必定的不可預知性;String 構造方法是徹底可預知的;因此咱們在編寫代碼時儘可能都用String 構造方法。當double必須用做BigDecimal的源時能夠用BigDecimal的靜態方法 valueOf() 如:ide
BigDecimal bDouble1 = BigDecimal.valueOf(2.3)
public BigDecimal add(BigDecimal value); //加法 public BigDecimal subtract(BigDecimal value); //減法 public BigDecimal multiply(BigDecimal value); //乘法 public BigDecimal divide(BigDecimal value); //除法
public static void main(String[] args) { BigDecimal a = new BigDecimal("4.5"); BigDecimal b = new BigDecimal("1.5"); System.out.println("a + b =" + a.add(b)); System.out.println("a - b =" + a.subtract(b)); System.out.println("a * b =" + a.multiply(b)); System.out.println("a / b =" + a.divide(b)); }
除法運算 divide() 方法,可能出現不能整除的狀況,好比 4.5/1.3,這時會報錯java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。其實divide方法有能夠傳三個參數。設計
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
第一參數表示除數
第二個參數表示小數點後保留位數,
第三個參數表示舍入模式,只有在做除法運算或四捨五入時纔用到舍入模式,具體舍入模式請查看,舍入模式章節。code
ROUND_CEILING //向正無窮方向舍入 ROUND_DOWN //向零方向舍入 ROUND_FLOOR //向負無窮方向舍入 ROUND_HALF_DOWN //向(距離)最近的一邊舍入,除非兩邊(的距離)是相等,若是是這樣,向下舍入, 例如1.55 保留一位小數結果爲1.5 ROUND_HALF_EVEN //向(距離)最近的一邊舍入,除非兩邊(的距離)是相等,若是是這樣,若是保留位數是奇數,使用ROUND_HALF_UP,若是是偶數,使用ROUND_HALF_DOWN ROUND_HALF_UP //向(距離)最近的一邊舍入,除非兩邊(的距離)是相等,若是是這樣,向上舍入, 1.55保留一位小數結果爲1.6 ROUND_UNNECESSARY //計算結果是精確的,不須要舍入模式 ROUND_UP //向遠離0的方向舍入
public static void main(String[] args) { BigDecimal a = new BigDecimal("4.5635"); a = a.setScale(3, RoundingMode.HALF_UP); //保留3位小數,且四捨五入 System.out.println(a); }
若是內容對你有幫助但願點贊收藏謝謝!!!ip