BigDecimal详解
1、BigDecimal基本介绍
当程序中涉及到金额时,必须使用 BigDecimal 而不是 double 或 float 。
1.1、浮点类型坑示例
- public static void main(String[] args) {
- float a = 1;
- float b = 0.9f;
- System.out.println(a - b);
- }
2、BigDecimal 的常用方法
2.1、常用构造方法
- new BigDecimal(int val):创建一个具有参数所指定整数值的对象。
- new BigDecimal(double val):(不推荐使用,因为存在精度丢失问题)创建一个具有参数所指定双精度值的对象。
- new BigDecimal(long val):创建一个具有参数所指定长整数值的对象
- new BigDecimal(String val):(推荐使用)创建一个具有参数所指定以字符串表示的数值的对象。
- public static void main(String[] args) {
- BigDecimal b_int = new BigDecimal(10);
- BigDecimal b_double = new BigDecimal(0.1);
- BigDecimal b_float = new BigDecimal(0.1f);
- BigDecimal b_string = new BigDecimal("0.1");
- BigDecimal b_valueof = BigDecimal.valueOf(0.1);
- System.out.println("b_int:" + b_int);
- System.out.println("b_double:" + b_double);
- System.out.println("b_float:" + b_float);
- System.out.println("b_string:" + b_string);
- System.out.println("b_valueof:" + b_valueof);
- }
输出如下:
使用构造函数时,推荐用 int 或 String 做参数,如果不满足,则建议使用 BigDecimal.valueOf 方法,该方法可接受 int、long、double、float 做参数,但注意不接受 String。
2.2、常用方法
注意:BigDecimal进行运算时必须要保证对象本身不能是null,否则就会抛空指针异常。
1)加减乘除
- add(BigDecimal):加,BigDecimal对象中的值相加,返回BigDecimal对象
- subtract(BigDecimal):减,BigDecimal对象中的值相减,返回BigDecimal对象
- multiply(BigDecimal):乘,BigDecimal对象中的值相乘,返回BigDecimal对象
- divide(BigDecimal):除,BigDecimal对象中的值相除,返回BigDecimal对象。该方法可能会遇到无限精度问题,会抛出异常,使用时需注意。所以我们建议在使用BigDecimal进行除运算时,一定要指定精度和舍入模式。
- public static void main(String[] args) {
- BigDecimal a = new BigDecimal("10");
- BigDecimal b = new BigDecimal("20");
- BigDecimal c = new BigDecimal("30");
- BigDecimal add = a.add(b);
- BigDecimal subtract = a.subtract(b);
- BigDecimal multiply = a.multiply(b);
- BigDecimal divide = a.divide(b);
- System.out.println("加结果为:" + add);
- System.out.println("减结果为:" + subtract);
- System.out.println("乘结果为:" + multiply);
- System.out.println("除结果为:" + divide);
- // 除不尽将会抛出异常
- BigDecimal divide2 = a.divide(c);
- }
输入结果如下:
其他常见方法:
方法 | 含义 |
abs() | 将BigDecimal对象中的值转换成绝对值 |
doubleValue() | 将BigDecimal对象中的值转换成双精度数 |
floatValue() | 将BigDecimal对象中的值转换成单精度数 |
longValue() | 将BigDecimal对象中的值转换成整数 |
compareTo(BigDecimal val) | 比较大小,返回int类型。0(相等) 1(大于) -1(小于) |
toPlainString() | 推荐使用,直接转换为字符串且不使用任何计数法 |
toString() | 转换为字符串,但在必要时使用科学计数法。 |
toEngineeringString() | 转换为字符串,但在必要时使用工程计数法。 工程记数法是一种工程计算中经常使用的记录数字的方法,与科学技术法类似,但要求10的幂必须是3的倍数 |
max(BigDecimal val) | 两值比较,返回最大值 |
negate() | 求相反数,正变负,负变正 |
pow(int n) | 求乘方,如BigDecimal.valueOf(2).pow(3)的值为8 |
3、设置精度和舍入模式
BigDecimal 并不代表无限精度,当在两个数除不尽的时候,就会报错。所以我们建议在使用BigDecimal进行除运算时,一定要指定精度和舍入模式。
- public static void main(String[] args) {
- BigDecimal b1 = new BigDecimal("1.0");
- BigDecimal b2 = new BigDecimal("3.0");
- // 保留3位小数,且四舍五入
- BigDecimal divide = b1.divide(b2, 3, RoundingMode.HALF_UP);
- System.out.println(divide);//0.33
- }
3.1、BigDecimal 中的舍入模式
9、最佳实践
- public static void main(String[] args) {
- // 使用字符串参数构造函数
- BigDecimal a = new BigDecimal("10");
- // 或使用BigDecimal.valueOf方法
- BigDecimal b = BigDecimal.valueOf(30);
- BigDecimal add = a.add(b);
- BigDecimal subtract = a.subtract(b);
- BigDecimal multiply = a.multiply(b);
- //进行除运算时,指定精度和舍入模式,避免除不尽导致报错
- BigDecimal divide = a.divide(b, 2, RoundingMode.HALF_UP);
- System.out.println("加结果为:" + add);
- System.out.println("减结果为:" + subtract);
- System.out.println("乘结果为:" + multiply);
- System.out.println("除结果为:" + divide);
- }
输出如下:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2023-01-09 ElasticSearch的基本使用
2020-01-09 Java的基本使用之核心类