Java数学工具类MathUtil详解

所属分类: 软件编程 / java 阅读数: 25
收藏 0 赞 0 分享

本文实例为大家分享了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;
  }
}

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

更多精彩内容其他人还在看

Springmvc restful配置遇到的小坑

本文是小编给大家带了的Springmvc restful配置遇到的小小坑,小编给大家带来了问题原因及解决办法,非常不错,具有参考借鉴价值,感兴趣的朋友一起看下吧
收藏 0 赞 0 分享

Java中的匿名内部类小结

java内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类。这篇文章主要介绍了Java中的匿名内部类的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java的云打印Lodop

这篇文章主要介绍了Java的云打印Lodop 的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Java线程池框架核心代码解析

这篇文章主要针对Java线程池框架核心代码进行详细解析,分析Java线程池框架的实现ThreadPoolExecutor,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java 交换两个变量的数值实现方法

下面小编就为大家带来一篇Java 交换两个变量的数值实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

全面了解JAVA_BaseDAO数据处理类

下面小编就为大家带来一篇全面了解JAVA_BaseDAO数据处理类。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

java、python、JavaScript以及jquery循环语句的区别

本篇文章主要介绍java、python、JavaScript以及jquery的循环语句的区别,这里整理了它们循环语句语法跟示例,以便大家阅读,更好的区分它们的不同
收藏 0 赞 0 分享

基于JDBC封装的BaseDao(实例代码)

下面小编就为大家带来一篇基于JDBC封装的BaseDao(实例代码)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

简单通用JDBC辅助类封装(实例)

下面小编就为大家带来一篇简单通用JDBC辅助类封装(实例)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

浅谈java线程中生产者与消费者的问题

下面小编就为大家带来一篇浅谈java线程中生产者与消费者的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享
查看更多