BigDecimal类型的运算使用

运算

(一)BigDecimal 加法运算——add()方法

1、Int 类型

		BigDecimal bigInt1 = new BigDecimal(6);
		BigDecimal bigInt2= new BigDecimal(8);
		BigDecimal intSum = new BigDecimal(0);
		//BigDecimal求和
		intSum = bigInt1 .add(bigInt2);
		System.out.println("和 :" +intSum);
		//打印输出:14

2、double 类型

		BigDecimal bigDouble1= new BigDecimal(6.6);
		BigDecimal bigDouble2= new BigDecimal(8.8);
		BigDecimal doubleSum = new BigDecimal(0);
		//BigDecimal求和
		doubleSum = bigDouble1.add(bigDouble2);
		System.out.println("和:" + doubleSum );
		//打印输出:15.4000000000000003552713678800500929355621337890625

输出的结果与我们心中所想是不是不太一样?

原因: double不能表示为任何有限长度的二进制小数,所以会出现丢失精度问题。
解决方法: 官方文档中建议使用字符串形式,这样不会丢失精度。

3、String类型

		BigDecimal bigString1 = new BigDecimal("6.6");
		BigDecimal bigString2 = new BigDecimal("8.8");
		BigDecimal stringSum = new BigDecimal(0);
		//BigDecimal求和
		stringSum= bigString1.add(bigString2);
		System.out.println("和 :" +stringSum);
		//打印输出:15.4

这样就完美的解决了丢失精度的问题。

(二)BigDecimal 减法运算——subtract()方法

1、Int 类型

		BigDecimal bigInt1 = new BigDecimal(8);
		BigDecimal bigInt2= new BigDecimal(6);
		BigDecimal intDifference = new BigDecimal(0);
		//BigDecimal求差
		intDifference = bigInt1.subtract(bigInt2);
		System.out.println("差 :" +intDifference);
		//打印输出:2

2、double 类型

		BigDecimal bigDouble1= new BigDecimal(8.8);
		BigDecimal bigDouble2= new BigDecimal(6.6);
		BigDecimal douDifference = new BigDecimal(0);
		//BigDecimal求差
		douDifference = bigDouble1.subtract(bigDouble2);
		System.out.println("差 :" +douDifference );
		//打印输出:2.2000000000000010658141036401502788066864013671875

3、String类型

		BigDecimal bigString1 = new BigDecimal("8.8");
		BigDecimal bigString2= new BigDecimal("6.6");
		BigDecimal stringDifference = new BigDecimal(0);
		//BigDecimal求差
		stringDifference = bigString1.subtract(bigString2);
		System.out.println("差 :" +stringDifference );
		//打印输出:2.2

(三)BigDecimal 乘法运算——multiply()方法

1、Int 类型

		BigDecimal bigInt1 = new BigDecimal(8);
		BigDecimal bigInt2= new BigDecimal(6);
		BigDecimal intProduct = new BigDecimal(0);
		//BigDecimal求积
		intProduct= bigInt1.multiply(bigInt2);
		System.out.println("积 :" +intProduct);
		//打印输出:48

2、double 类型

		BigDecimal bigDouble1= new BigDecimal(8.8);
		BigDecimal bigDouble2= new BigDecimal(6.6);
		BigDecimal douProduct = new BigDecimal(0);
		//BigDecimal求积
		douProduct = bigDouble1.multiply(bigDouble2);
		System.out.println("积 :" +douProduct );
		//打印输出:58.0800000000000015631940186722201564809837179480972682468591095084065045739407651126384735107421875

3、String类型

		BigDecimal bigString1= new BigDecimal("8.8");
		BigDecimal bigString2= new BigDecimal("6.6");
		//BigDecimal求积
		BigDecimal strProduct  = new BigDecimal(0);
		strProduct = bigString1.multiply(bigString2);
		System.out.println("积 :" +strProduct);
		//打印输出:58.08

(四)BigDecimal 除法运算——divide()方法

1、Int 类型

		BigDecimal bigInt1= new BigDecimal(24);
		BigDecimal bigInt2= new BigDecimal(3);
		BigDecimal intConsult  = new BigDecimal(0);
		//BigDecimal求商
		intConsult = bigInt1.divide(bigInt2);
		System.out.println("商 :" +intConsult);
		//打印输出:8

2、double 类型

		BigDecimal bigDouble1= new BigDecimal(24.6);
		BigDecimal bigDouble2= new BigDecimal(2);
		BigDecimal douConsult  = new BigDecimal(0);
		//BigDecimal求商
		douConsult = bigDouble1.divide(bigDouble2);
		System.out.println("商 :" +douConsult);
		//打印输出:12.300000000000000710542735760100185871124267578125

3、String类型

		BigDecimal bigString1= new BigDecimal("24.6");
		BigDecimal bigString2= new BigDecimal("2");
		BigDecimal strConsult  = new BigDecimal(0);
		//BigDecimal求商
		strConsult = bigString1.divide(bigString2);
		System.out.println("商:" +strConsult);
		//打印输出:12.3

(五)关于BigDecimal.setScale方法—— 处理小数

1、BigDecimal.ROUND_UP 进位处理

		BigDecimal test= new BigDecimal(6.51);
		//表示保留一位小数,只要第二位小数不为0都进1
		System.out.println(test.setScale(1,BigDecimal.ROUND_UP));
		-----------------------------------------
		输出:6.6
	
		BigDecimal test= new BigDecimal(6.50);
		//表示保留一位小数,只要第二位小数不为0都进1
		System.out.println(test.setScale(1,BigDecimal.ROUND_UP));
		-----------------------------------------
		输出:6.5

2、BigDecimal.ROUND_DOWN直接删除多余的小数位

		BigDecimal test= new BigDecimal(6.59);
		//直接删除多余的小数位
		System.out.println(test.setScale(1,BigDecimal.ROUND_DOWN));
		-----------------------------------------
		输出:6.5

3、BigDecimal.ROUND_HALF_UP 四舍五入

		BigDecimal test= new BigDecimal(6.55);
		//四舍五入
		System.out.println(test.setScale(1,BigDecimal.ROUND_HALF_UP));
		-----------------------------------------
		输出:6.6

(六)BigDecimal移动小数点的方法

1、movePointRight、scaleByPowerOfTen 小数点向右移动两位

		BigDecimal test= new BigDecimal("88.666");
		System.out.println(test.movePointRight(2));
		System.out.println(test.scaleByPowerOfTen(2));
		-----------------------------------------
		输出:
			8866.6
			8866.6

2、movePointLeft 小数点向左移动两位

		BigDecimal test= new BigDecimal("88.666");
		System.out.println(test.movePointLeft(2));
		-----------------------------------------
		输出:0.88666

(七)BigDecimal除法后保留两位小数

		BigDecimal bigTest1= new BigDecimal("100");
		BigDecimal bigTest2= new BigDecimal("68.688");
		System.out.println(bigTest2.divide(bigTest1,2,BigDecimal.ROUND_HALF_UP));
		-----------------------------------------
		输出:0.69

工具示例

加法

/**
     * @return java.math.BigDecimal 总和
     * 示例:BigDecimalUtils.add(参数,参数,参数,参数,...);
     * @Description 加法运算
     * @Param [param] 可变长度数组,把需要计算的数值填进来
     * @Author Lucky
     * @Date 2021/10/21
     */
    public static BigDecimal add(BigDecimal... param) {
        BigDecimal sumAdd = BigDecimal.valueOf(0);
        for (int i = 0; i < param.length; i++) {
            BigDecimal bigDecimal = param[i] == null ? new BigDecimal(0) : param[i];
            sumAdd = sumAdd.add(bigDecimal);
        }
        return sumAdd;
    }

减法

/**
     * @return java.math.BigDecimal 计算结果
     * 示例:BigDecimalUtils.subtract(被减数,减数,减数,减数,...);
     * @Description 加法运算 如果被减数为null 结果就为0
     * @Param [param] 第一个为被减数 可以传入多个 因为参数是一个可变长度的数组
     * @Author Lucky
     * @Date 2021/10/21
     */
    public static BigDecimal subtract(BigDecimal... param) {
        BigDecimal sumLess = param[0];//被减数
        if (sumLess == null) return new BigDecimal(0);
        for (int i = 1; i < param.length; i++) {
            BigDecimal bigDecimal = param[i] == null ? new BigDecimal(0) : param[i];
            sumLess = sumLess.subtract(bigDecimal);
        }
        return sumLess;
    }

乘法

/**
     * @return java.math.BigDecimal 计算结果 保留小数点后两位 规则为四舍五入
     * @Description 乘法运算 如一方参数为0或者null计算结果为0
     * @Param [first, last]
     * @Author Lucky
     * @Date 2021/10/21
     */
    public static BigDecimal multiply(BigDecimal first, BigDecimal last) {
        if (first == null) first = new BigDecimal(0);
        if (last == null) last = new BigDecimal(0);
        return first.multiply(last).setScale(2, BigDecimal.ROUND_HALF_UP);
    }

除法

/**
     * @return java.math.BigDecimal 计算结果 保留小数点后两位 规则为四舍五入
     * @Description 除法运算 如一方参数为0或者null计算结果为0
     * @Param [first, last]
     * @Author Lucky
     * @Date 2021/10/21
     */
    public static BigDecimal divide(BigDecimal first, BigDecimal last) {
        if (first == null) first = new BigDecimal(0);
        if (last == null) last = new BigDecimal(0);
        return first.divide(last).setScale(2, BigDecimal.ROUND_HALF_UP);
    }

判空

/**
     /**
     * @return boolean
     * @Description 判断传入的数据是否为空 为空返回false 不为空返回true
     * 使用此方法要先引入依赖包:
     * <dependency>
     * <groupId>cn.hutool</groupId>
     * <artifactId>hutool-all</artifactId>
     * <version>5.7.5</version>
     * </dependency>
     * @Param [param] BigDecimal 类型
     * @Author Lucky
     * @Date 2021/11/6
     */
    public static boolean isNotEmpty(BigDecimal param) {
        if (ObjectUtil.isNotEmpty(param)) return true;
        return false;
    }

/**
     * @return boolean
     * @Description 判断传入的数据是否为空 为空返回true 不为空返回false
     * 使用此方法要先引入依赖包:
     * <dependency>
     * <groupId>cn.hutool</groupId>
     * <artifactId>hutool-all</artifactId>
     * <version>5.7.5</version>
     * </dependency>
     * @Param [param] BigDecimal 类型
     * @Author Lucky
     * @Date 2021/11/6
     */
    public static boolean isEmpty(BigDecimal param) {
        if (ObjectUtil.isEmpty(param)) return true;
        return false;
    }

工具类

package com.common.utils;

import cn.hutool.core.util.ObjectUtil;

import java.math.BigDecimal;

/**
 * @program [projectName]
 * @Author Lucky
 * @Date 2021/10/21 14:24
 * @Description BigDecimal计算工具类
 * @Version 1.0
 */
public class BigDecimalUtils {

    /**
     * @return java.math.BigDecimal 总和
     * 示例:BigDecimalUtils.add(参数,参数,参数,参数,...);
     * @Description 加法运算
     * @Param [param] 可变长度数组,把需要计算的数值填进来
     * @Author Lucky
     * @Date 2021/10/21
     */
    public static BigDecimal add(BigDecimal... param) {
        BigDecimal sumAdd = BigDecimal.valueOf(0);
        for (int i = 0; i < param.length; i++) {
            BigDecimal bigDecimal = param[i] == null ? new BigDecimal(0) : param[i];
            sumAdd = sumAdd.add(bigDecimal);
        }
        return sumAdd;
    }

    /**
     * @return java.math.BigDecimal 计算结果
     * 示例:BigDecimalUtils.subtract(被减数,减数,减数,减数,...);
     * @Description 加法运算 如果被减数为null 结果就为0
     * @Param [param] 第一个为被减数 可以传入多个 因为参数是一个可变长度的数组
     * @Author Lucky
     * @Date 2021/10/21
     */
    public static BigDecimal subtract(BigDecimal... param) {
        BigDecimal sumLess = param[0];//被减数
        if (sumLess == null) return new BigDecimal(0);
        for (int i = 1; i < param.length; i++) {
            BigDecimal bigDecimal = param[i] == null ? new BigDecimal(0) : param[i];
            sumLess = sumLess.subtract(bigDecimal);
        }
        return sumLess;
    }

    /**
     * @return java.math.BigDecimal 计算结果 保留小数点后两位 规则为四舍五入
     * @Description 乘法运算 如一方参数为0或者null计算结果为0
     * @Param [first, last]
     * @Author Lucky
     * @Date 2021/10/21
     */
    public static BigDecimal multiply(BigDecimal first, BigDecimal last) {
        if (first == null) first = new BigDecimal(0);
        if (last == null) last = new BigDecimal(0);
        return first.multiply(last).setScale(2, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * @return java.math.BigDecimal 计算结果 保留小数点后两位 规则为四舍五入
     * @Description 除法运算 如一方参数为0或者null计算结果为0
     * @Param [first, last]
     * @Author Lucky
     * @Date 2021/10/21
     */
    public static BigDecimal divide(BigDecimal first, BigDecimal last) {
        if (first == null) first = new BigDecimal(0);
        if (last == null) last = new BigDecimal(0);
        return first.divide(last).setScale(2, BigDecimal.ROUND_HALF_UP);
    }


    /**
     * @return boolean
     * @Description 判断传入的数据是否为空 为空返回false 不为空返回true
     * 使用此方法要先引入依赖包:
     * <dependency>
     * <groupId>cn.hutool</groupId>
     * <artifactId>hutool-all</artifactId>
     * <version>5.7.5</version>
     * </dependency>
     * @Param [param] BigDecimal 类型
     * @Author Lucky
     * @Date 2021/11/6
     */
    public static boolean isNotEmpty(BigDecimal param) {
        if (ObjectUtil.isNotEmpty(param)) return true;
        return false;
    }

    /**
     * @return boolean
     * @Description 判断传入的数据是否为空 为空返回true 不为空返回false
     * 使用此方法要先引入依赖包:
     * <dependency>
     * <groupId>cn.hutool</groupId>
     * <artifactId>hutool-all</artifactId>
     * <version>5.7.5</version>
     * </dependency>
     * @Param [param] BigDecimal 类型
     * @Author Lucky
     * @Date 2021/11/6
     */
    public static boolean isEmpty(BigDecimal param) {
        if (ObjectUtil.isEmpty(param)) return true;
        return false;
    }
}

建议

建议使用hutool工具包来实现,毕竟人家是专业的

总结

1、商业计算使用BigDecimal
2、尽量使用参数类型为String的构造函数
3、BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值

————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Boy_Martin/article/details/126583323

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值