1. 程式人生 > >[十五]java.math包簡介,RoundingMode與MathContext

[十五]java.math包簡介,RoundingMode與MathContext

java.math包提供了java中的數學類 包括基本的浮點庫、複雜運算以及任意精度的資料運算 image_5bd6634a_5366 '可以看得到,主要包括三個類一個列舉 BigDecimal和BigInteger接下來會詳細介紹 先說下另外兩個

RoundingMode

舍入行為/ 近似模式 image_5bd6634a_227b 對於很多計算,都可能涉及到精度的問題 比如兩個數進行除法, 十進位制下,1/3  結果為無限迴圈小數 顯然計算機中不可能儲存這個無限迴圈的小數,那麼這個 0.3333333...... 你到底要近似成為多少? 0?  0.5? 0.33? 1? RoundingMode 就是這麼一個存在 如同它的名字一樣,近似模式 為可能丟棄精度的數值操作指定一種舍入行為

舍入模式

UP 遠離零方向舍入
DOWN 向零方向舍入
image_5bd6634a_35c1
CEILING 向正無限大方向舍入
FLOOR 向負無限大方向舍入
image_5bd6634a_53c9
HALF_UP 向最接近數字方向舍入
如果與兩個相鄰數字的距離相等,則向上舍入
HALF_DOWN 向最接近數字方向舍入
如果與兩個相鄰數字的距離相等,則向下舍入
HALF_EVEN 向最接近數字方向舍入 如果與兩個相鄰數字的距離相等,則向相鄰的偶數舍入
HALF_UP/ HALF_DOWN /  HALF_DOWN  都是最接近數字舍入 不過如果兩個相鄰的數字距離相等,將會採取不同的模式 HALF_UP就是平時的四捨五入
UNNECESSARY
用於斷言的舍入模式
請求的操作具有精確的結果,不需要進行舍入

示例

image_5bd6634a_25d7 擁有靜態的valueOf方法,對BigDecimal中的常量,進行對映轉換 返回RoundingMode物件 image_5bd6634b_40d0 這個enum 是打算用來替代 BigDecimal中的舍入模式常量 (BigDecimal.ROUND_UP、BigDecimal.ROUND_DOWN 等) 所以後續寫程式碼使用這個列舉

MathContext

計算上下文/數學規則 image_5bd6634b_6c63 RoundingMode 是舍入模式的抽象描述,僅僅描述了舍入的規則 但是運算中還有一些其他的規則,比如 保留幾位有效數字? MathContext則是針對於計算的更進一步抽象 是封裝上下文設定的不可變物件,它描述數字運算子的某些規則 他擁有兩個屬性 precision:某個操作使用的數字個數;結果舍入到此精度 roundingMode:一個 RoundingMode 物件,該物件指定舍入使用的演算法 image_5bd6634b_4bf5 針對於這兩個屬性,也提供了兩個方法進行獲取 image_5bd6634b_364f

構造方法

MathContext(int setPrecision, RoundingMode setRoundingMode)           構造一個新的 MathContext,它具有指定的精度和舍入模式
MathContext(int setPrecision)           構造一個新的 MathContext,它具有指定的精度和 HALF_UP 舍入模式 呼叫上一個構造方法 image_5bd6634b_c46
MathContext(String val)           根據字串構造一個新的 MathContext 注意:該字串的格式必須與 toString() 方法生成的字串的格式相同
不是可以隨便寫的!!

equals

equals方法已經被重寫,對比的是兩個屬性的數值是否相等 image_5bd6634b_7ac0

toString

注意這個格式可以用於構造物件 image_5bd6634b_fdf

常量

我們剛才已經說明,MathContext 就是針對於運算中的一些規則進行描述的型別 對於一些規定,已經內建了幾個靜態物件供我們使用
static MathContext DECIMAL128 其精度設定與 IEEE 754R Decimal128 格式(即 34 個數字)匹配 舍入模式為 HALF_EVEN 這是 IEEE 754R 的預設舍入模式
static MathContext DECIMAL32 其精度設定與 IEEE 754R Decimal32 格式(即 7 個數字)匹配 舍入模式為 HALF_EVEN 這是 IEEE 754R 的預設舍入模式
static MathContext DECIMAL64 其精度設定與 IEEE 754R Decimal64 格式(即 16 個數字)匹配 舍入模式為 HALF_EVEN 這是 IEEE 754R 的預設舍入模式
static MathContext UNLIMITED 其設定具有無限精度演算法所需值的 MathContext 物件
image_5bd6634b_59c9

總結

RoundingMode  與MathContext 是針對舍入模式以及運算規則的一個抽象 RoundingMode 就是個列舉 MathContext 他在使用上也可以理解為"常量" 一樣的存在