前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【蓝桥杯Java_C组·从零开始卷】第五节(二)、BigDecimal的使用

【蓝桥杯Java_C组·从零开始卷】第五节(二)、BigDecimal的使用

作者头像
红目香薰
发布2022-11-29 18:09:24
1.1K0
发布2022-11-29 18:09:24
举报
文章被收录于专栏:CSDNToQQCode

不限制长度的浮点数计算【BigDecimal】

目录

BigDecimal四则运算与取模运算

RoundingMode枚举介绍

RoundingMode舍入模式

UP

CEILING

FLOOR

HALF_UP (Half指的中点值,例如0.5、0.05,0.15等等)

HALF_DOWN

UNNECESSARY

黄金分割 

BigDecimal四则运算与取模运算

代码语言:javascript
复制
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枚举介绍

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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等等)

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
package Action;

import java.math.BigDecimal;

public class demo {
	public static double format(double d) {
		BigDecimal bd = new BigDecimal(d).setScale(6, BigDecimal.ROUND_HALF_UP);
		double dd = bd.doubleValue();//返回浮点数值
		return dd;
	}

	public static void f(int a, int b) {
		double d = format((double) a / b);
		if (d == 0.618034) {
			System.out.println(a + "/" + b + "=" + d);
			return;
		}
		f(b, a + b);
	}

	public static void main(String[] args) {
		f(1, 3);
	}
}

 到这里,不限制长度的浮点数计算就学习完了。希望能对大家邮搜帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 不限制长度的浮点数计算【BigDecimal】
    • BigDecimal四则运算与取模运算
      • RoundingMode枚举介绍
        • RoundingMode舍入模式
        • UP
        • CEILING
        • FLOOR
        • HALF_UP (Half指的中点值,例如0.5、0.05,0.15等等)
        • HALF_DOWN
        • UNNECESSARY
      • 黄金分割 
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档