java.math.BigDecimaljava
BigDecimal類型(+ - * /)所用的屬性app
11.10 BigDecimal類ide
對於不須要任何準確計算精度的數字能夠直接使用float或double,可是若是須要精確計算的結果,則必須使用BigDecimal類,並且使用BigDecimal類也能夠進行大數的操做。BigDecimal類的經常使用方法如表11-15所示。spa
表11-15 BigDecimal類的經常使用方法.net
序號orm |
方 法對象 |
類型blog |
描 述ip |
1ci |
public BigDecimal(double val) |
構造 |
將double表示形式轉換 爲BigDecimal |
2 |
public BigDecimal(int val) |
構造 |
將int表示形式轉換爲 BigDecimal |
3 |
public BigDecimal(String val) |
構造 |
將字符串表示 形式轉換爲BigDecimal |
4 |
public BigDecimal add(BigDecimal augend) |
普通 |
加法 |
5 |
public BigDecimal subtract(BigDecimal |
普通 |
減法 |
6 |
public BigDecimal multiply(BigDecimal |
普通 |
乘法 |
7 |
public BigDecimal divide(BigDecimal |
普通 |
除法 |
範例:進行四捨五入的四則運算
不可變的、任意精度的有符號十進制數。BigDecimal 由任意精度的整數非標度值和32位的整數標度(scale)組成。
若是爲零或正數,則標度是小數點後的位數。若是爲負數,則將該數的非標度值乘以10的負scale次冪。
所以,BigDecimal表示的數值是(unscaledValue × 10-scale)。
與之相關的還有兩個類:
java.math.MathContext:
該對象是封裝上下文設置的不可變對象,它描述數字運算符的某些規則,如數據的精度,舍入方式等。
java.math.RoundingMode:
這是一種枚舉類型,定義了不少經常使用的數據舍入方式。
這個類用起來仍是很比較複雜的,緣由在於舍入模式,數據運算規則太多太多,
不是數學專業出身的人看着中文API都難以理解,這些規則在實際中使用的時候在翻閱都來得及。
在銀行、賬戶、計費等領域,BigDecimal提供了精確的數值計算。其中8種舍入方式值得掌握。
一、ROUND_UP
舍入遠離零的舍入模式。
在丟棄非零部分以前始終增長數字(始終對非零捨棄部分前面的數字加1)。
注意,此舍入模式始終不會減小計算值的大小。
二、ROUND_DOWN
接近零的舍入模式。
在丟棄某部分以前始終不增長數字(從不對捨棄部分前面的數字加1,即截短)。
注意,此舍入模式始終不會增長計算值的大小。
三、ROUND_CEILING
接近正無窮大的舍入模式。
若是 BigDecimal 爲正,則舍入行爲與 ROUND_UP 相同;
若是爲負,則舍入行爲與 ROUND_DOWN 相同。
注意,此舍入模式始終不會減小計算值。
四、ROUND_FLOOR
接近負無窮大的舍入模式。
若是 BigDecimal 爲正,則舍入行爲與 ROUND_DOWN 相同;
若是爲負,則舍入行爲與 ROUND_UP 相同。
注意,此舍入模式始終不會增長計算值。
五、ROUND_HALF_UP
向「最接近的」數字舍入,若是與兩個相鄰數字的距離相等,則爲向上舍入的舍入模式。
若是捨棄部分 >= 0.5,則舍入行爲與 ROUND_UP 相同;不然舍入行爲與 ROUND_DOWN 相同。
注意,這是咱們大多數人在小學時就學過的舍入模式(四捨五入)。
六、ROUND_HALF_DOWN
向「最接近的」數字舍入,若是與兩個相鄰數字的距離相等,則爲上舍入的舍入模式。
若是捨棄部分 > 0.5,則舍入行爲與 ROUND_UP 相同;不然舍入行爲與 ROUND_DOWN 相同(五舍六入)。
七、ROUND_HALF_EVEN
向「最接近的」數字舍入,若是與兩個相鄰數字的距離相等,則向相鄰的偶數舍入。
若是捨棄部分左邊的數字爲奇數,則舍入行爲與 ROUND_HALF_UP 相同;
若是爲偶數,則舍入行爲與 ROUND_HALF_DOWN 相同。
注意,在重複進行一系列計算時,此舍入模式能夠將累加錯誤減到最小。
此舍入模式也稱爲「銀行家舍入法」,主要在美國使用。四捨六入,五分兩種狀況。
若是前一位爲奇數,則入位,不然捨去。
如下例子爲保留小數點1位,那麼這種舍入方式下的結果。
1.15>1.2 1.25>1.2
八、ROUND_UNNECESSARY
斷言請求的操做具備精確的結果,所以不須要舍入。
若是對得到精確結果的操做指定此舍入模式,則拋出ArithmeticException。
根據給定的舍入模式將輸入數字舍入爲一位數的結果 輸入數字 UP DOWN CEILING FLOOR HALF_UP HALF_DOWN HALF_EVEN UNNECESSARY 5.5 6 5 6 5 6 5 6 拋出 ArithmeticException 2.5 3 2 3 2 3 2 2 拋出 ArithmeticException 1.6 2 1 2 1 2 2 2 拋出 ArithmeticException 1.1 2 1 2 1 1 1 1 拋出 ArithmeticException 1.0 1 1 1 1 1 1 1 1 -1.0 -1 -1 -1 -1 -1 -1 -1 -1 -1.1 -2 -1 -1 -2 -1 -1 -1 拋出 ArithmeticException -1.6 -2 -1 -1 -2 -2 -2 -2 拋出 ArithmeticException -2.5 -3 -2 -2 -3 -3 -2 -2 拋出 ArithmeticException -5.5 -6 -5 -5 -6 -6 -5 -6 拋出 ArithmeticException
咱們常常要將數字進行格式化,好比取2位小數,這是最多見的。Java 提供 DecimalFormat 類,幫你用最快的速度將數字格式化爲你須要的樣子。下面是一個例子:
[java] view plain copy
DecimalFormat 類主要靠 # 和 0 兩種佔位符號來指定數字長度。0 表示若是位數不足則以 0 填充,# 表示只要有可能就把數字拉上這個位置。上面的例子包含了差很少全部的基本用法,若是你想了解更多,請參考 DecimalFormat 類的文檔。