【蓝桥杯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组·从零开始卷】第六