Java数学工具类MathUtil详解

 更新时间:2021年09月13日 15:55:29   作者:BlueKitty1210  
这篇文章主要为大家详细介绍了Java数学工具类MathUtil的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Java数学工具类MathUtil的具体代码,供大家参考,具体内容如下

package cn.xbz.util.math;
 
import java.math.BigDecimal;
 
/**
 * @title 数学计算工具类
 * @description 提供常用的数值加减乘除计算 , 及多个数值的求和 , 平均值 , 最大最小值计算
 */
public class XMathUtil {
  /** 默认的除法精确度 */
  private static final int DEF_DIV_SCALE = 2;
 
  /**
   * 精确加法运算
   * @param v1 被加数
   * @param v2 加数
   * @return 两个参数的和(BigDecimal)
   */
  public static BigDecimal add(BigDecimal v1, BigDecimal v2) {
    if (null == v1) {
      v1 = BigDecimal.ZERO;
    }
    if (null == v2) {
      v2 = BigDecimal.ZERO;
    }
    return v1.add(v2);
  }
 
  /**
   * 精确减法运算
   * @param v1 被减数
   * @param v2 减数
   * @return 两个参数的差(BigDecimal)
   */
  public static BigDecimal subtract(BigDecimal v1, BigDecimal v2) {
    if (null == v1) {
      v1 = BigDecimal.ZERO;
    }
    if (null == v2) {
      v2 = BigDecimal.ZERO;
    }
    return v1.subtract(v2);
  }
 
  /**
   * 精确乘法运算
   * @param v1 被乘数
   * @param v2 乘数
   * @return 两个参数的积(BigDecimal)
   */
  public static BigDecimal multiply(BigDecimal v1, BigDecimal v2) {
    if (null == v1) {
      v1 = BigDecimal.ONE;
    }
    if (null == v2) {
      v2 = BigDecimal.ONE;
    }
    return v1.multiply(v2);
  }
 
  /**
   * ( 相对 )精确除法运算 , 当发生除不尽情况时 , 精确到 小数点以后2位 , 以后数字四舍五入
   * @param v1 被除数
   * @param v2 除数
   * @return 两个参数的商(BigDecimal)
   */
  public static BigDecimal divide(BigDecimal v1, BigDecimal v2) {
    return v1.divide(v2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP);
  }
 
  /**
   * ( 相对 )精确除法运算 . 当发生除不尽情况时 , 由scale参数指 定精度 , 以后数字四舍五入
   * @param v1 被除数
   * @param v2 除数
   * @param scale 表示表示需要精确到小数点以后几位
   * @return 两个参数的商(BigDecimal)
   */
  public static BigDecimal divide(BigDecimal v1, BigDecimal v2, Integer scale) {
    if (null == v1) {
      return BigDecimal.ZERO;
    }
    if (null == v2) {
      v2 = BigDecimal.ONE;
    }
 
    if (v2.compareTo(BigDecimal.ZERO) == 0) {
      throw new IllegalArgumentException("除数不能为0");
    }
 
    if (scale < 0) {
      throw new IllegalArgumentException("精确度不能小于0");
    }
 
    return v1.divide(v2, scale, BigDecimal.ROUND_HALF_UP);
  }
 
  /**
   * 精确加法运算
   * @param v1 被加数
   * @param v2 加数
   * @return 两个参数的和(String)
   */
  public static String add(String v1, String v2) {
    if (isBlank(v1)) {
      v1 = "0";
    }
    if (isBlank(v2)) {
      v2 = "0";
    }
    BigDecimal b1 = new BigDecimal(v1.trim());
    BigDecimal b2 = new BigDecimal(v2.trim());
    return String.valueOf(add(b1, b2));
  }
 
 
  /**
   * 精确减法运算
   * @param v1 被减数
   * @param v2 减数
   * @return 两个参数的差(String)
   */
  public static String subtract(String v1, String v2) {
    if (isBlank(v1)) {
      v1 = "0";
    }
    if (isBlank(v2)) {
      v2 = "0";
    }
    BigDecimal b1 = new BigDecimal(v1.trim());
    BigDecimal b2 = new BigDecimal(v2.trim());
    return String.valueOf(subtract(b1, b2));
  }
 
  /**
   * 精确乘法运算
   * @param v1 被乘数
   * @param v2 乘数
   * @return 两个参数的积(String)
   */
  public static String multiply(String v1, String v2) {
    if (isBlank(v1)) {
      v1 = "1";
    }
    if (isBlank(v2)) {
      v2 = "1";
    }
    BigDecimal b1 = new BigDecimal(v1.trim());
    BigDecimal b2 = new BigDecimal(v2.trim());
    return String.valueOf(multiply(b1, b2));
  }
 
  /**
   * ( 相对 )精确除法运算 , 当发生除不尽情况时 , 精确到 小数点以后2位 , 以后数字四舍五入
   * @param v1 被除数
   * @param v2 除数
   * @return 两个参数的商(String)
   */
  public static String divide(String v1, String v2) {
    return divide(v1, v2, DEF_DIV_SCALE);
  }
 
  /**
   * ( 相对 )精确除法运算 . 当发生除不尽情况时 , 由scale参数指 定精度 , 以后数字四舍五入
   * @param v1 被除数
   * @param v2 除数
   * @param scale 表示表示需要精确到小数点以后几位
   * @return 两个参数的商(String)
   */
  public static String divide(String v1, String v2, Integer scale) {
    if (null == v1) {
      return "0";
    }
    if (null == v2) {
      v2 = "1";
    }
    BigDecimal b1 = new BigDecimal(v1.trim());
    BigDecimal b2 = new BigDecimal(v2.trim());
    return String.valueOf(divide(b1, b2, scale));
  }
 
  /**
   * 精确加法运算 , 计算多个数值总和 , 若其中有null值则忽略
   * @param valList 被加数集合
   * @return 两个参数的和(BigDecimal)
   */
  public static BigDecimal sum(BigDecimal v1, BigDecimal... valList) {
    if (null == v1) {
      v1 = BigDecimal.ZERO;
    }
    if (null == valList || valList.length == 0) {
      return v1;
    }
    for (BigDecimal val : valList) {
      if (null != val) {
        v1 = v1.add(val);
      }
    }
    return v1;
  }
 
  /**
   * 精确加法运算 , 计算多个数值总和 , 若其中有null值则忽略
   * @param valList 被加数集合
   * @return 两个参数的和(String)
   */
  public static String sum(String v1, String... valList) {
    if (isBlank(v1)) {
      v1 = "0";
    }
    if (null == valList || valList.length == 0) {
      return v1;
    }
    BigDecimal b1 = new BigDecimal(v1.trim());
    for (String val : valList) {
      if (!isBlank(val)) {
        b1 = add(b1, new BigDecimal(val.trim()));
      }
    }
    return String.valueOf(b1);
  }
 
  /**
   * 平均数
   * @param valList
   * @return
   */
  public static BigDecimal avg(BigDecimal... valList) {
    if (null != valList && valList.length != 0) {
      return divide(sum(BigDecimal.ZERO, valList), new BigDecimal(valList.length));
    }
    return BigDecimal.ZERO;
  }
 
  /**
   * 平均数
   * @param valList
   * @return
   */
  public static String avg(String... valList) {
    if (null != valList && valList.length != 0) {
      return divide(sum("0", valList), String.valueOf(valList.length));
    }
    return "0";
  }
 
  /**
   * 最大值
   * @param v1
   * @param valList
   * @return
   */
  public static BigDecimal max(BigDecimal v1, BigDecimal... valList) {
    BigDecimal max = v1;
    if (null == valList || valList.length == 0) {
      return max;
    }
    for (BigDecimal val : valList) {
      if (null != val && val.compareTo(max) > 0) {
        max = val;
      }
    }
    return max;
  }
 
  /**
   * 最大值
   * @param valList
   * @return
   */
  public static BigDecimal maxArr(BigDecimal... valList) {
    if (null == valList || valList.length == 0) {
      return null;
    }
 
    return max(valList[0], valList);
  }
 
  /**
   * 最小值
   * @param v1
   * @param valList
   * @return
   */
  public static BigDecimal min(BigDecimal v1, BigDecimal... valList) {
    BigDecimal min = v1;
    if (null == valList || valList.length == 0) {
      return min;
    }
    for (BigDecimal val : valList) {
      if (null != val && val.compareTo(min) < 0) {
        min = val;
      }
    }
    return min;
  }
 
  /**
   * 最小值
   * @param valList
   * @return
   */
  public static BigDecimal minArr(BigDecimal... valList) {
    if (null == valList || valList.length == 0) {
      return null;
    }
    return min(valList[0], valList);
  }
 
  /**
   * 最大值
   * @param v1
   * @param valList
   * @return
   */
  public static String max(String v1, String... valList) {
    if (isBlank(v1)) {
      return null;
    }
    if (null == valList || valList.length == 0) {
      return v1;
    }
    BigDecimal maxBd = new BigDecimal(v1.trim());
 
    for (String val : valList) {
      if (!isBlank(val) && new BigDecimal(val).compareTo(maxBd) > 0) {
        maxBd = new BigDecimal(val);
      }
    }
    return String.valueOf(maxBd);
  }
 
  /**
   * 最大值
   * @param valList
   * @return
   */
  public static String maxArr(String... valList) {
    if (null == valList || valList.length == 0) {
      return null;
    }
    return max(valList[0], valList);
  }
 
  /**
   * 最小值
   * @param v1
   * @param valList
   * @return
   */
  public static String min(String v1, String... valList) {
    if (isBlank(v1)) {
      return null;
    }
    if (null == valList || valList.length == 0) {
      return v1;
    }
    BigDecimal minBd = new BigDecimal(v1.trim());
 
    for (String val : valList) {
      if (!isBlank(val) && new BigDecimal(val).compareTo(minBd) < 0) {
        minBd = new BigDecimal(val);
      }
    }
    return String.valueOf(minBd);
  }
 
  /**
   * 最小值
   * @param valList
   * @return
   */
  public static String minArr(String... valList) {
    if (null == valList || valList.length == 0) {
      return null;
    }
    return min(valList[0], valList);
  }
 
  /**
   * 判断字符串是否为空(不依赖第三方)
   * @param str
   * @return
   */
  private static boolean isBlank(String str) {
    return null == str || str.trim().length() == 0;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java上传下载文件并实现加密解密

    Java上传下载文件并实现加密解密

    这篇文章主要介绍了Java上传下载文件并实现加密解密,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 使用idea远程调试jar包的配置过程

    使用idea远程调试jar包的配置过程

    这篇文章主要介绍了使用idea远程调试jar包的配置过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • java Object转byte与byte转Object方式

    java Object转byte与byte转Object方式

    这篇文章主要介绍了java Object转byte与byte转Object方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 如何在IDEA中查看依赖关系的方法步骤

    如何在IDEA中查看依赖关系的方法步骤

    这篇文章主要介绍了如何在IDEA中查看依赖关系的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 最简单的spring boot打包docker镜像的实现

    最简单的spring boot打包docker镜像的实现

    这篇文章主要介绍了最简单的spring boot打包docker镜像的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Seata AT模式如何实现行锁详解

    Seata AT模式如何实现行锁详解

    这篇文章主要为大家介绍了Seata AT模式如何实现行锁详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • java -D参数设置系统属性无效问题及解决

    java -D参数设置系统属性无效问题及解决

    这篇文章主要介绍了java -D参数设置系统属性无效问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 浅聊一下Java中的锁机制

    浅聊一下Java中的锁机制

    Java中的锁机制是保证多线程并发访问共享资源安全性的重要手段之一。Java提供了两种类型的锁机制:synchronized关键字和Lock接口。本文将介绍这两种锁机制的原理及使用方法,并通过代码示例讲解它们的使用
    2023-03-03
  • Java虚拟机启动过程探索

    Java虚拟机启动过程探索

    当我们在编写Java应用的时候,很少会注意Java程序是如何被运行的,如何被操作系统管理和调度的,带着好奇心,探索一下Java虚拟机启动过程
    2022-05-05
  • java异步编程详解

    java异步编程详解

    这篇文章主要介绍了java异步编程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04

最新评论