当前位置: 首页 > news >正文

java.math.BigDecimal常用操作

刚学Java时我们会用float和double来做带小数的数值计算,但它俩只能用来做科学计算或者是工程计算。如果对精度要求高,比如项目中计算金额、工程面积时,我们需要使用Java在java.math包中提供的BigDecimal类。


记录一下我在项目中写的一个操作BigDecimal的工具类:

package com.xxx.util;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * BigDecimal工具类
 * <p>
 * 加法 add()
 * 减法 subtract()
 * 乘法 multiply()
 * 除法 divide()
 * 绝对值 abs()
 *
 * @Author wanglingqiang
 * @Date 2021/9/15 14:39
 */
public class BigDecimalUtil {

    private static final BigDecimal BigDecimal_ZERO = new BigDecimal("0.00");

    /**
     * 判断是否为空或0
     *
     * @param arg
     * @return
     */
    public static boolean isEmpty(BigDecimal arg) {
        if (arg == null || BigDecimal.ZERO.equals(arg) || BigDecimal_ZERO.equals(arg)) {
            return true;
        }
        return false;
    }

    /**
     * 乘法(精确小数点后2位、四舍五入)
     *
     * @param arg1
     * @param arg2
     * @return
     */
    public static BigDecimal multiply(BigDecimal arg1, BigDecimal arg2) {
        if (arg1 == null || arg2 == null) {
            return BigDecimal.ZERO;
        }
        return arg1.multiply(arg2).setScale(2, RoundingMode.HALF_UP);
    }

    /**
     * 除法(精确小数点后2位、四舍五入)
     *
     * @param arg1
     * @param arg2
     * @return
     */
    public static BigDecimal divide(BigDecimal arg1, BigDecimal arg2) {
        if (arg1 == null || arg2 == null) {
            return BigDecimal.ZERO;
        }
        return BigDecimalUtil.divide(arg1, arg2, 2);
    }

    /**
     * 除法(四舍五入)
     *
     * @param arg1
     * @param arg2
     * @param scale 精确几位数
     * @return
     */
    public static BigDecimal divide(BigDecimal arg1, BigDecimal arg2, int scale) {
        if (arg1 == null || arg2 == null) {
            return BigDecimal.ZERO;
        }
        return arg1.divide(arg2, scale, RoundingMode.HALF_UP);
    }

    /**
     * 返回值,精确小数点后2位、四舍五入
     *
     * @param arg
     * @return
     */
    public static BigDecimal valueOf(BigDecimal arg) {
        if (arg == null) {
            return BigDecimal.ZERO;
        }
        return arg.setScale(2, RoundingMode.HALF_UP);
    }

    /**
     * 比较两个值的大小
     * arg1 > arg2 返回1
     * arg1 < arg2 返回-1
     * arg1 == arg2 返回0
     *
     * @param arg1
     * @param arg2
     * @return
     */
    public static int compare(BigDecimal arg1, BigDecimal arg2) {
        if (arg1 == null || arg2 == null) {
            throw new NullPointerException();
        }
        return arg1.compareTo(arg2);
    }

    private BigDecimalUtil() {
    }
    
}


本章完


相关文章:

  • Docker命令
  • ES6-解构赋值
  • python爬虫爬取电影数据并做可视化
  • ip地址怎么改网速快
  • Mac 安装软件各种报错解决方案
  • HarmonyOS应用开发—资源分类与访问
  • MFC多文档程序,从菜单关闭一个文档和直接点击右上角的x效果不同
  • 【漏洞复现】泛微e-office OfficeServer2.php 存在任意文件读取漏洞复现
  • 【教程】微信小程序导入外部字体详细流程
  • 面试被问:Mysql的InnoDB下RR是如何解决幻读问题的
  • win系统环境搭建(三)——Windows安装maven
  • 练习敲代码速度
  • 刷一下算法
  • 音视频转换器 Permute 3 for mac中文
  • Nacos注册中心
  • SWC 流程
  • Electron(v26.2.1)无法加载React Developer Tools(v4.28.0)
  • 深度学习的三维重建 论文+源码+解析+译文+批注 MVSNet系列最新顶刊总结 下载
  • Java工具类Hutool使用
  • Layui + Flask | 表单元素(组件篇)(06)
  • 门票在“缩水”,古镇怎么办
  • 对话上海外贸企业:关税战虽起,中国供应商却难以被取代
  • 九江市人大常委会原党组成员、副主任戴晓慧主动交代问题,正接受审查调查
  • 新任遂宁市委副书记王忠诚已任市政府党组书记
  • 2025中国互联网企业家座谈会在京召开
  • 从板凳席到指挥台,横扫广东男篮的少帅潘江究竟有何神奇