BigDecimal

BigDecimal

概述

和BigInteger类似,BigDecimal可以表示一个任意大小且精度完全准确的浮点数。

	/**
	 * @Description: 创建一个BigDecimal实例 
	 *
	 * @return BigDecimal
	 * @param num
	 * @return
	 *
	 * @date: 2019年10月15日 下午4:42:01
	 */
	public static BigDecimal createBigDecimal(String num) {
		return new BigDecimal(num);
	}

组成

如果查看BigDecimal的源码,可以发现,实际上一个BigDecimal是通过一个BigInteger和一个scale来表示的,即BigInteger表示一个完整的整数,而scale表示小数位数:

public class BigDecimal extends Number implements Comparable<BigDecimal> {
    private final BigInteger intVal;
    private final int scale;
}

对小数位进行操作

	/**
	* 
	* @Description: 获取BigDecimal小数位数
	* 
	* 	如果返回的是负数,则表示该数为整数,并且后 |返回值| 位为0。
	*
	* @return int 
	* @param bd
	* @return
	*
	* @author: lenovo
	* @date: 2019年10月15日 下午4:44:37
	 */
	public static int BigDecimalGetScale(BigDecimal bd) {
		return bd.scale();
	}
	
	/**
	 * 
	* @Description: 对BigDecimal小数位截取
	*
	* @return BigDecimal
	* @param bd
	* @param roundType	截取方式
	* 				RoundingMode.HALF_UP 四舍五入
	* 				RoundingMode.DOWN	 直接截断
	* @param digit 截取后的小数位数
	* @return
	*
	* @author: lenovo
	* @date: 2019年10月15日 下午4:53:43
	 */
	public static BigDecimal BigDecimalSetScale(BigDecimal bd,RoundingMode roundType,int digit) {
		return bd.setScale(digit, roundType);
	}

	/**
	 * 
	* @Description: 消除末尾多余的0
	* 		1.10000 -> 1.1
	*
	* @return BigDecimal
	* @param bd
	* @return
	*
	* @author: lenovo
	* @date: 2019年10月15日 下午4:46:10
	 */
	public static BigDecimal BigDecimalStripTrailingZeros(BigDecimal bd) {
		return bd.stripTrailingZeros();
	}

运算

	/**
	 * 
	 * @Description: 两个BigDecimal只能通过方法进行数值计算
	 *
	 * @return BigInteger
	 * @param bi1
	 * @param bi2
	 * @param calculateType
	 * @return
	 *
	 * @date: 2019年10月15日 下午4:18:59
	 */
	public static BigDecimal calculate(BigDecimal bd1,BigDecimal bd2,String calculateType) {
		switch (calculateType) {
		case "+":
			return bd1.add(bd2);
		case "-":
			return bd1.subtract(bd2);
		case "*":
			return bd1.multiply(bd2);
		case "/":
			// 除法存在除不尽的情况,所以需要对小数位数进行设置
			return bd1.divide(bd2,10,RoundingMode.HALF_UP);
		case "^":
			return bd1.pow(bd2.intValueExact());
		default:
			return null;
		}
	}

比较两个BigDecimal的大小

  • equals():不但要求两个BigDecimal的值相等,还要求它们的scale()相等。1.equals(1.0) false
  • compareTo()用于比较两个BigDecimal大小
    • 返回负数:小于
    • 返回0:等于
    • 返回正数:大于
	public static void main(String[] args) {
		BigDecimal d1 = new BigDecimal("123.456");
		BigDecimal d2 = new BigDecimal("123.45600");
		// false,因为scale不同
		System.out.println(d1.equals(d2)); 
		// true,因为d2去除尾部0后scale变为2
		System.out.println(d1.equals(d2.stripTrailingZeros())); 
		// 0
		System.out.println(d1.compareTo(d2)); 
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值