【蓝桥杯Java_C组·从零开始卷】第五节(二)、BigDecimal的使用
不限制長度的浮點數計算【BigDecimal】
目錄
BigDecimal四則運算與取模運算
RoundingMode枚舉介紹
RoundingMode舍入模式
UP
CEILING
FLOOR
HALF_UP (Half指的中點值,例如0.5、0.05,0.15等等)
HALF_DOWN
UNNECESSARY
黃金分割?
BigDecimal四則運算與取模運算
package Action;import java.math.BigDecimal;public class demo {public static void main(String[] args) {BigDecimal x = new BigDecimal("2222");BigDecimal y = new BigDecimal("11111");// 加法BigDecimal add = x.add(y);System.out.println(add);// 減法BigDecimal subtract = x.subtract(y);System.out.println(subtract);// 乘法BigDecimal multiply = x.multiply(y);System.out.println(multiply);// 除法:divide(除數,保留小數位數,小數點處理方式)BigDecimal divide = x.divide(y,2,BigDecimal.ROUND_DOWN);System.out.println(divide);//除法取整BigDecimal divideToIntegralValue = x.divideToIntegralValue(y);System.out.println(divideToIntegralValue);//取模·余數BigDecimal remainder = x.remainder(y);System.out.println(remainder);} }RoundingMode枚舉介紹
package java.math;public enum RoundingMode {UP(BigDecimal.ROUND_UP),DOWN(BigDecimal.ROUND_DOWN),CEILING(BigDecimal.ROUND_CEILING),FLOOR(BigDecimal.ROUND_FLOOR),HALF_UP(BigDecimal.ROUND_HALF_UP),HALF_DOWN(BigDecimal.ROUND_HALF_DOWN),HALF_EVEN(BigDecimal.ROUND_HALF_EVEN),UNNECESSARY(BigDecimal.ROUND_UNNECESSARY);final int oldMode;private RoundingMode(int oldMode) {this.oldMode = oldMode;}public static RoundingMode valueOf(int rm) {switch(rm) {case BigDecimal.ROUND_UP:return UP;case BigDecimal.ROUND_DOWN:return DOWN;case BigDecimal.ROUND_CEILING:return CEILING;case BigDecimal.ROUND_FLOOR:return FLOOR;case BigDecimal.ROUND_HALF_UP:return HALF_UP;case BigDecimal.ROUND_HALF_DOWN:return HALF_DOWN;case BigDecimal.ROUND_HALF_EVEN:return HALF_EVEN;case BigDecimal.ROUND_UNNECESSARY:return UNNECESSARY;default:throw new IllegalArgumentException("argument out of range");}} }RoundingMode是一個枚舉類,有以下幾個值:UP,DOWN,CEILING,FLOOR,HALF_UP,HALF_DOWN,HALF_EVEN,UNNECESSARY?
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的方向舍入
RoundingMode舍入模式
UP
public?final?static?int?ROUND_UP?=?0;定義:遠離零方向舍入。
解釋:始終對非零舍棄部分前面的數字加 1。注意,此舍入模式始終不會減少計算值的絕對值。
圖示:
示例:
| 輸入數字 | 使用 UP 舍入模式將輸入數字舍入為一位數 |
| 5.5 | 6 |
| 2.5 | 3 |
| 1.6 | 2 |
| 1.1 | 2 |
| 1.0 | 1 |
| -1.0 | -1 |
| -1.1 | -2 |
| -1.6 | -2 |
| -2.5 | -3 |
| -5.5 | -6 |
DOWN
public?final?static?int?ROUND_DOWN?=?1;定義:向零方向舍入。
解釋:從不對舍棄部分前面的數字加 1(即截尾)。注意,此舍入模式始終不會增加計算值的絕對值。
圖示:
示例:
| 輸入數字 | 使用 DOWN 舍入模式將輸入數字舍入為一位數 |
| 5.5 | 5 |
| 2.5 | 2 |
| 1.6 | 1 |
| 1.1 | 1 |
| 1.0 | 1 |
| -1.0 | -1 |
| -1.1 | -1 |
| -1.6 | -1 |
| -2.5 | -2 |
| -5.5 | -5 |
CEILING
public?final?static?int?ROUND_CEILING?=?2;定義:向正無限大方向舍入。
解釋:如果結果為正,則舍入行為類似于 RoundingMode.UP;如果結果為負,則舍入行為類似于RoundingMode.DOWN。注意,此舍入模式始終不會減少計算值。
圖示:
示例:
| 輸入數字 | 使用 DOWN 舍入模式將輸入數字舍入為一位數 |
| 5.5 | 6 |
| 2.5 | 3 |
| 1.6 | 2 |
| 1.1 | 2 |
| 1.0 | 1 |
| -1.0 | -1 |
| -1.1 | -1 |
| -1.6 | -1 |
| -2.5 | -2 |
| -5.5 | -5 |
FLOOR
public?final?static?int?ROUND_FLOOR?=?3;定義:向負無限大方向舍入。
解釋:如果結果為正,則舍入行為類似于 RoundingMode.DOWN;如果結果為負,則舍入行為類似于RoundingMode.UP。注意,此舍入模式始終不會增加計算值。
圖示:
示例:
| 輸入數字 | 使用 DOWN 舍入模式將輸入數字舍入為一位數 |
| 5.5 | 5 |
| 2.5 | 2 |
| 1.6 | 1 |
| 1.1 | 1 |
| 1.0 | 1 |
| -1.0 | -1 |
| -1.1 | -2 |
| -1.6 | -2 |
| -2.5 | -3 |
| -5.5 | -6 |
HALF_UP (Half指的中點值,例如0.5、0.05,0.15等等)
public?final?static?int?ROUND_HALF_UP?=?4;定義:向最接近的數字方向舍入,如果與兩個相鄰數字的距離相等,則向上舍入。
解釋:如果被舍棄部分 >= 0.5,則舍入行為同 RoundingMode.UP;否則舍入行為同RoundingMode.DOWN。注意,此舍入模式就是通常學校里講的四舍五入。
圖示:
示例:
| 輸入數字 | 使用 DOWN 舍入模式將輸入數字舍入為一位數 |
| 5.5 | 6 |
| 2.5 | 3 |
| 1.6 | 2 |
| 1.1 | 1 |
| 1.0 | 1 |
| -1.0 | -1 |
| -1.1 | -1 |
| -1.6 | -2 |
| -2.5 | -3 |
| -5.5 | -6 |
HALF_DOWN
public?final?static?int?ROUND_HALF_DOWN?=?5;定義:向最接近的數字方向舍入,如果與兩個相鄰數字的距離相等,則向下舍入。
解釋:如果被舍棄部分 > 0.5,則舍入行為同 RoundingMode.UP;否則舍入行為同RoundingMode.DOWN。注意,此舍入模式就是通常講的五舍六入。
圖示:
示例:
| 輸入數字 | 使用 DOWN 舍入模式將輸入數字舍入為一位數 |
| 5.5 | 5 |
| 2.5 | 2 |
| 1.6 | 2 |
| 1.1 | 1 |
| 1.0 | 1 |
| -1.0 | -1 |
| -1.1 | -1 |
| -1.6 | -2 |
| -2.5 | -2 |
| -5.5 | -5 |
HALF_EVEN
public?final?static?int?ROUND_HALF_EVEN?=?6;定義:向最接近數字方向舍入,如果與兩個相鄰數字的距離相等,則向相鄰的偶數舍入。
解釋:如果舍棄部分左邊的數字為奇數,則舍入行為同 RoundingMode.HALF_UP;如果為偶數,則舍入行為同RoundingMode.HALF_DOWN。注意,在重復進行一系列計算時,根據統計學,此舍入模式可以在統計上將累加錯誤減到最小。此舍入模式也稱為“銀行家舍入法”,主要在美國使用。此舍入模式類似于 Java 中對float 和double 算法使用的舍入策略。
圖示:
示例:
| 輸入數字 | 使用 DOWN 舍入模式將輸入數字舍入為一位數 |
| 5.5 | 6 |
| 2.5 | 2 |
| 1.6 | 2 |
| 1.1 | 1 |
| 1.0 | 1 |
| -1.0 | -1 |
| -1.1 | -1 |
| -1.6 | -2 |
| -2.5 | -2 |
| -5.5 | -6 |
UNNECESSARY
public?final?static?int?ROUND_UNNECESSARY?=??7;定義:用于斷言請求的操作具有精確結果,因此不發生舍入。
解釋:計算結果是精確的,不需要舍入,否則拋出 ArithmeticException。
示例:
| 輸入數字 | 使用 DOWN 舍入模式將輸入數字舍入為一位數 |
| 5.5 | 拋出 ArithmeticException |
| 2.5 | 拋出 ArithmeticException |
| 1.6 | 拋出 ArithmeticException |
| 1.1 | 拋出 ArithmeticException |
| 1.0 | 1 |
| -1.0 | -1 |
| -1.1 | 拋出 ArithmeticException |
| -1.6 | 拋出 ArithmeticException |
| -2.5 | 拋出 ArithmeticException |
| -5.5 | 拋出 ArithmeticException |
黃金分割?
黃金分割數0.618與美學有重要的關系。舞臺上報幕員所站的位置大約就是舞臺寬度的0.618處,
墻上的畫像一般也掛在房間高度的0.618處,甚至股票的波動據說也能找到0.618的影子....
黃金分割數是個無理數,也就是無法表示為兩個整數的比值。
0.618只是它的近似值,其真值可以通過對5開方減去1再除以2來獲得,
我們取它的一個較精確的近似值:0.618034
有趣的是,一些簡單的數列中也會包含這個無理數,這很令數學家震驚!
1 3 4 7 11 18 29 47 .... 稱為“魯卡斯隊列”。它后面的每一個項都是前邊兩項的和。
如果觀察前后兩項的比值,即:1/3,3/4,4/7,7/11,11/18 ... 會發現它越來越接近于黃金分割數!
你的任務就是計算出從哪一項開始,這個比值四舍五入后已經達到了與0.618034一致的精度。
請寫出該比值。格式是:分子/分母。比如:29/47
?到這里,不限制長度的浮點數計算就學習完了。希望能對大家郵搜幫助。歡迎一鍵三連。
總結
以上是生活随笔為你收集整理的【蓝桥杯Java_C组·从零开始卷】第五节(二)、BigDecimal的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【蓝桥杯Java_C组·从零开始卷】第五
- 下一篇: 【蓝桥杯Java_C组·从零开始卷】第六