BigDecimal 常用方法

1 BigDecimal 的定义

  • BigDecimal的 4 种构造方法
// 创建一个参数所指定整数值的对象
// public BigDecimal(int val) 
BigDecimal num = new BigDecimal(13);

// 创建一个参数所指定双精度值的对象(不建议采用)
// public BigDecimal(double val) 
BigDecimal num2 = new BigDecimal(5.34);

// 创建一个参数所指定长整数值的对象
// public BigDecimal(long val) 
BigDecimal num3 = new BigDecimal(4L);

// 创建一个参数所指定以字符串表示的数值的对象
// public BigDecimal(String val) 
BigDecimal num4 = new BigDecimal("5.34");

2 各种数据类型与 BigDecimal 的相互转换

2.1 int 与 BigDecimal 的相互转换
// int 转 BigDecimal
int val = 12;
BigDecimal bdNum = new BigDecimal(val);

// BigDecimal 转 int
BigDecimal bdNum2 = new BigDecimal(12);
int val2 = bdNum2.intValue();
2.2 long 和 BigDecimal 的相互转换
// long 转 BigDecimal
long val3 = 12L;
BigDecimal bdNum3 = new BigDecimal(val3);

// BigDecimal 转 long
BigDecimal bdNum4 = new BigDecimal(12);
long val4 = bdNum4.longValue();
2.3 double 和 BigDecimal 的相互转换
2.3.1 double 转 BigDecimal
// 第一种方法:public BigDecimal(double val)
// 不推荐,存在精度问题
double val5 = 12.23;
BigDecimal bdNum5 = new BigDecimal(val5);
System.out.println(bdNum5); // 12.230000000000000426325641456060111522674560546875

// 第二种方法:public static BigDecimal valueOf(double val)
double val6 = 12.23;
BigDecimal bdNum6 = BigDecimal.valueOf(val6);
System.out.println(bdNum6); // 12.23

// 第三种方法:Double.toString(double d)
double val7 = 12.23;
BigDecimal bdNum7 = new BigDecimal(Double.toString(val7));
System.out.println(bdNum7); // 12.23
2.3.2 BigDecimal 转 double
BigDecimal bdNum8 = new BigDecimal("12.23");
double val8 = bdNum8.doubleValue();
System.out.println(val8); // 12.23
2.4 float 和 BigDecimal 的相互转换
2.4.1 float 转 BigDecimal
// 第一种方法:Float.toString(float f)
float val9 = 12.23f;
BigDecimal bdNum9 = new BigDecimal(Float.toString(val9));
System.out.println(bdNum9); // 12.23
// 第二种方法:public static BigDecimal valueOf(double val) 
// 不推荐,会损失精度
float val10 = 12.23f;
BigDecimal bdNum10 = BigDecimal.valueOf(val10);
System.out.println(bdNum10); // 12.229999542236328
2.4.2 BigDecimal 转 float
BigDecimal bdNum11 = new BigDecimal("12.23");
float val11 = bdNum11.floatValue();
System.out.println(val11); // 12.23

3 加减乘除

// 加法
// public BigDecimal add(BigDecimal augend)
BigDecimal result = num.add(num2);

// 减法
// public BigDecimal subtract(BigDecimal subtrahend)
BigDecimal result = num.subtract(num2);

// 乘法
// public BigDecimal multiply(BigDecimal multiplicand)
BigDecimal result = num.multiply(num2);

// 除法
// public BigDecimal divide(BigDecimal divisor)
BigDecimal result = num.divide(num2);

4 设置精度及取整(保留0位小数)

// 设置精度的方法
// scale 是保留小数位数; roundingMode 为小数模式
// 除法 - 对计算结果设置精度
// public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
BigDecimal result = num.divide(num2, 1, BigDecimal.ROUND_HALF_UP);

// 对一个 BigDecimal 对象设置精度
// public BigDecimal setScale(int newScale, int roundingMode)
BigDecimal result = num.setScale(1, BigDecimal.ROUND_HALF_UP);
  • 假设 scale 为 n,则 roundingMode 的取值为
roundingMode说明
BigDecimal.ROUND_UP保留n位小数,第(n+1)位数字大于0则进1
BigDecimal.ROUND_DOWN保留n位小数,后面的小数位直接舍弃
BigDecimal.ROUND_CEILING如果 BigDecimal 是正数则做 ROUND_UP 操作;负数则做 ROUND_DOWN 操作(取附近较大的数)
BigDecimal.ROUND_FLOOR如果 BigDecimal 是正数则做 ROUND_DOWN 操作;负数则做 ROUND_UP 操作(取附近较小的数)
BigDecimal.ROUND_HALF_UP四舍五入
BigDecimal.ROUND_HALF_DOWN同 ROUND_HALF_UP,区别仅在于第(n+1)位数字等于5且后面小数位全为0时会舍而不是入
BigDecimal.ROUND_HALF_EVEN四舍六入,五看前一位是偶数就舍,奇数就入
BigDecimal.ROUND_UNNECESSARY不保留n位小数,如果第(n+1)位起存在小数位且不为0就抛异常:java.lang.ArithmeticException

5 比较大小

BigDecimal 的 compareTo() 方法进行的是值比较,返回值为 -1,0,1:

num1 < num2,返回 -1

num1 = num2,返回 0

num1 > num2,返回 1

// public int compareTo(BigDecimal val)
// BigDecimal 的 equals 方法当精度不一样的时候也当做不相等,而 compareTo 方法忽略精度的不同,只比较数值是否相同
BigDecimal num3 = new BigDecimal("3.30");
BigDecimal num4 = new BigDecimal("3.3");
BigDecimal num5 = new BigDecimal("3.5");
System.out.println(num3.compareTo(num4)); // 0
System.out.println(num3.equals(num4)); // false
System.out.println(num3.compareTo(num5)); // -1

6 取余

// public BigDecimal[] divideAndRemainder(BigDecimal divisor)
// 该方法的参数即为除数,返回一个 BigDecimal 数组,返回数组中包含两个元素,第一个元素为两数相除的商,第二个元素为余数
BigDecimal num6 = new BigDecimal(11);
BigDecimal num7 = new BigDecimal(3);
BigDecimal[] results = num6.divideAndRemainder(num7);
System.out.println(results[0]); // 3
System.out.println(results[1]); // 2
03-15
当前问题中的“cyt4bb7”看起来像是一个随机字符串或者非具体指向的查询词,无法从中提取明确的技术背景或上下文关联。以下是基于已有引用内容的回答尝试: 如果假设这是某种硬件设备、软件模块或者是特定技术环境下的代号,则可以从以下几个方面推测其含义并提供解答框架。 ### 可能的方向一:与B站相关内容关联 如果有意提及某个具体的教程视频或直播课程名称,“cyt4bb7”可能是该资源的一个唯一标识符(如AV/BV编号)。可以前往B站搜索关键词“乾勤”,进入直播间ID `22173475` 或访问链接 [http://live.bilibili.com/22173475](http://live.bilibili.com/22173475),查找是否有对应的教学资料[^1]。 ### 方向二:串口配置相关联 假如此字符串代表一种通信协议里的参数设置项,在嵌入式开发环境中需特别留意端口号及其映射关系。“把你对应的串口填写到刚刚找到的声明里。” 这句话表明需要确认实际使用的物理接口是否匹配逻辑定义,并通过双击右键跳转至目标函数完成修改操作[^2]。 ```c++ // 示例代码展示如何更改串口初始化部分 void UART_Init(uint8_t port, uint32_t baudRate){ switch(port){ case 1: USART1->BAUD = SystemCoreClock / (baudRate * 16); break; default: // Add other ports as needed... break; } } ``` ### 方向三:车规级MCU领域探讨 当涉及汽车电子控制系统时,“cyt4bb7”也许指代某款满足严格标准要求的产品型号。例如,提到“AEC-Q100/Q104 认证测试阶段”以及“ASIL 安全等级划分”,说明这类器件必须经历长时间验证流程才能正式投入市场应用[^3]。 ### 方向四:车辆动态控制算法研究 最后还存在这样一种可能性——即它属于自动驾驶辅助系统的内部变量名之一。比如针对方向盘角度调节所运用的位置型 PID 控制器设计思路:“方向控制采用位置式 PID 控制...这种震荡严重影响了车的整体表现。” 显然这里强调的是减少误差累积效应的重要性[^4]。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_秋牧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值