java.math包提供了java中的數學類
包括基本的浮點庫、復雜運算以及任意精度的數據運算
'可以看得到,主要包括三個類一個枚舉
BigDecimal和BigInteger接下來會詳細介紹
先說下另外兩個
RoundingMode
舍入行為/ 近似模式
對於很多計算,都可能涉及到精度的問題
比如兩個數進行除法, 十進制下,1/3
結果為無限循環小數
顯然計算機中不可能保存這個無限循環的小數,那么這個 0.3333333......
你到底要近似成為多少?
0? 0.5? 0.33? 1?
RoundingMode 就是這么一個存在
如同它的名字一樣,近似模式
為可能丟棄精度的數值操作指定一種舍入行為
舍入模式
UP | 遠離零方向舍入 |
DOWN | 向零方向舍入 |
CEILING | 向正無限大方向舍入 |
FLOOR | 向負無限大方向舍入 |
HALF_UP | 向最接近數字方向舍入 如果與兩個相鄰數字的距離相等,則向上舍入 |
HALF_DOWN | 向最接近數字方向舍入 如果與兩個相鄰數字的距離相等,則向下舍入 |
HALF_EVEN |
向最接近數字方向舍入
如果與兩個相鄰數字的距離相等,則向相鄰的偶數舍入
|
HALF_UP/ HALF_DOWN / HALF_DOWN 都是最接近數字舍入
不過如果兩個相鄰的數字距離相等,將會采取不同的模式
HALF_UP就是平時的四舍五入
UNNECESSARY | 用於斷言的舍入模式 請求的操作具有精確的結果,不需要進行舍入 |
示例
擁有靜態的valueOf方法,對BigDecimal中的常量,進行映射轉換
返回RoundingMode對象
這個enum 是打算用來替代 BigDecimal中的舍入模式常量
(BigDecimal.ROUND_UP、BigDecimal.ROUND_DOWN 等)
所以后續寫代碼使用這個枚舉
MathContext
計算上下文/數學規則
RoundingMode 是舍入模式的抽象描述,僅僅描述了舍入的規則
但是運算中還有一些其他的規則,比如
保留幾位有效數字?
MathContext則是針對於計算的更進一步抽象
是封裝上下文設置的不可變對象,它描述數字運算符的某些規則
他擁有兩個屬性
precision:某個操作使用的數字個數;結果舍入到此精度
roundingMode:一個 RoundingMode 對象,該對象指定舍入使用的算法
針對於這兩個屬性,也提供了兩個方法進行獲取
構造方法
MathContext(int setPrecision, RoundingMode setRoundingMode)
構造一個新的 MathContext,它具有指定的精度和舍入模式
|
MathContext(int setPrecision)
構造一個新的 MathContext,它具有指定的精度和 HALF_UP 舍入模式
調用上一個構造方法
|
MathContext(String val)
根據字符串構造一個新的 MathContext
注意:該字符串的格式必須與 toString() 方法生成的字符串的格式相同不是可以隨便寫的!! |
equals
equals方法已經被重寫,對比的是兩個屬性的數值是否相等
toString
注意這個格式可以用於構造對象
常量
我們剛才已經說明,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 對象
|
總結
RoundingMode 與MathContext 是針對舍入模式以及運算規則的一個抽象
RoundingMode 就是個枚舉
MathContext 他在使用上也可以理解為"常量" 一樣的存在