BigDecimal用法详解


前言

在我们对数字需要高精度要求时,例如财务方面的数字,需要用 java.math.BigDecimal。


提示:以下是本篇文章正文内容,下面案例可供参考

一、简介

  • 在需要精确的小数计算时再使用BigDecimal,BigDecimal的性能比double和float差,在处理庞大复杂的运算时尤为明显。
  • 尽量使用参数类型为 String 的构造函数。
  • BigDecimal都是不可变的(immutable), 在进行每一次四则运算时,都会产生一个新的对象 。

二、BigDecimal的基本用法

1.创建对象

  • BigDecimal的构造函数有很多,可以通过传入字符串或数字来创建对象,强烈推荐使用字符串来构造对象。
BigDecimal decimal = new BigDecimal("52.1");
BigDecimal decimal = new BigDecimal(100);
BigDecimal decimal = new BigDecimal(String.valueOf(101));
// 当需要一个为0的BigDecimal类型的数据时,可以使用 BigDecimal.ZERO来代表
BigDecimal.ZERO == new BigDecimal(0);

2.基本运算


BigDecimal add = decimal1.add(decimal2); 			// 加
BigDecimal subtract = decimal1.subtract(decimal2);	// 减
BigDecimal multiply = decimal1.multiply(decimal2);  // 乘
  • 除法,因为有除不尽的情况会报错,所以除的时候最好加上保留几位小数
BigDecimal divide = decimal1.divide(decimal2);  	// 除
// 2:代表保留2位小数,HALF_UP:四舍五入,推荐使用下面这种除法
BigDecimal divide = decimal1.divide(decimal2, 2, RoundingMode.HALF_UP);

3.比较操作

BigDecimal a = new BigDecimal(10);
BigDecimal b= new BigDecimal("10");
a.compareTo(b) == 0  	// 代表 a=b
a.compareTo(b) == 1  	// 代表 a>b
a.compareTo(b) == -1 	// 代表 a<b

4.金额格式化

NumberFormat currency = NumberFormat.getCurrencyInstance(); // 货币格式化
NumberFormat percent = NumberFormat.getPercentInstance();   // 百分比格式化
percent.setMaximumFractionDigits(3); 						// 百分比小数点最多3位

BigDecimal amount = new BigDecimal("521.21"); 				// 金额
BigDecimal interestRate = new BigDecimal("0.008"); 			// 利率
BigDecimal interest = amount.multiply(interestRate); 		// 相乘

System.out.println("金额:" + currency.format(amount));		// 金额:¥521.21
System.out.println("利率:" + percent.format(interestRate));// 利率:0.8%
System.out.println("利息:" + currency.format(interest));   // 利息:¥4.17

5.去除BigDecimal小数点后多余的0

  • 使用bigdecimal时时常会保留小数位数,不足补0的情况,在日常中调用equals方法等就会出现100与100.00比较错误的情况,所以一般会去除尾部 0
  • 使用 stripTrailingZeros() 方法去除尾部 0
  • 使用 toPlainString() 方法去除科学计数法
  • 一般联合起来使用:result.stripTrailingZeros().toPlainString();
BigDecimal bigDecimal1 = new BigDecimal("10.00");
BigDecimal bigDecimal2 = new BigDecimal("1000.00");
BigDecimal result = bigDecimal2.divide(bigDecimal1, 4, BigDecimal.ROUND_HALF_UP);
System.out.println(result.stripTrailingZeros()); 				 // 1E+2
System.out.println(result.stripTrailingZeros().toPlainString()); // 100

总结

日子,要的是知足;生活,要的是幸福;生命,要的是健康;做人,要的是骨气;做事,要的是尽心;人生,要的是无悔。珍惜身边的幸福;欣赏自己的拥有。

在这里插入图片描述

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值