NC 数学运算工具类 MathTool

354 篇文章 102 订阅
package nc.vo.pubapp.pattern.pub;

import nc.vo.pub.lang.UFDouble;

/**
 * 数学运算工具类
 * 
 */
public class MathTool {
  private MathTool() {
    // 缺省构造方法
  }

  /**
   * 数学运算工具类的工厂方法。
   * 
   * @return 返回数学运算工具类的实例
   * @deprecated 用具体的static方法替代
   */
  @Deprecated
  public static MathTool getInstance() {
    return new MathTool();
  }

  /**
   * 两个数值的加法算法 数值为null时作为0对待
   * 
   * @param d1 要计算的数值1
   * @param d2 要计算的数值2
   * @return d1加上d2的运算结果
   */
  public static UFDouble add(UFDouble d1, UFDouble d2) {
    UFDouble oper1 = MathTool.nvl(d1);
    UFDouble oper2 = MathTool.nvl(d2);
    return oper1.add(oper2);
  }

  /**
   * 两个数值值是否相等 数值为null时作为0对待
   * 
   * @param d1 要计算的数值1
   * @param d2 要计算的数值2
   * @return 两个数值相等返回真
   */
  public static boolean equals(UFDouble d1, UFDouble d2) {
    return MathTool.compareTo(d1, d2) == 0;
  }

  /**
   * 数值1是否大于数值2 数值为null时作为0对待
   * 
   * @param d1 要计算的数值1
   * @param d2 要计算的数值2
   * @return 数值1大于数值2时返回真
   */
  public static boolean greaterThan(UFDouble d1, UFDouble d2) {
    return MathTool.compareTo(d1, d2) > 0;
  }

  /**
   * 数值1是否小于数值2 数值为null时作为0对待
   * 
   * @param d1 要计算的数值1
   * @param d2 要计算的数值2
   * @return 数值1小于数值2时返回真
   */
  public static boolean lessThan(UFDouble d1, UFDouble d2) {
    return MathTool.compareTo(d1, d2) < 0;
  }

  /**
   * 两个数值的减法算法 。数值为null时,作为0对待
   * 
   * @param d1 要计算的数值1
   * @param d2 要计算的数值2
   * @return d1减去d2的运算结果
   */
  public static UFDouble sub(UFDouble d1, UFDouble d2) {
    UFDouble oper1 = MathTool.nvl(d1);
    UFDouble oper2 = MathTool.nvl(d2);
    return oper1.sub(oper2);
  }

  /**
   * 比较两个数值的大小。数值为null时,作为0对待
   * 
   * @param d1 要计算的数值1
   * @param d2 要计算的数值2
   * @return 0 相等
   *         小于0 d1小于d2
   *         大于0 d1大于d2
   */
  public static int compareTo(UFDouble d1, UFDouble d2) {
    UFDouble oper1 = MathTool.nvl(d1);
    UFDouble oper2 = MathTool.nvl(d2);
    return oper1.compareTo(oper2);
  }

  /**
   * 比较两个数值的绝对值大小。数值为null时,作为0对待
   * 
   * @param d1 要计算的数值1
   * @param d2 要计算的数值2
   * @return 0 相等
   *         小于0 d1小于d2
   *         大于0 d1大于d2
   */
  public static int absCompareTo(UFDouble d1, UFDouble d2) {
    UFDouble oper1 = d1;
    UFDouble oper2 = d2;

    if (oper1 == null) {
      oper1 = UFDouble.ZERO_DBL;
    }
    else {
      oper1 = oper1.abs();
    }
    if (oper2 == null) {
      oper2 = UFDouble.ZERO_DBL;
    }
    else {
      oper2 = oper2.abs();
    }
    return oper1.compareTo(oper2);
  }

  /**
   * 比较两个数值的算术符号是否相反
   * 
   * @param d1 要计算的数值1
   * @param d2 要计算的数值2
   * @return 算术符号相反时返回true
   */
  public static boolean isDiffSign(UFDouble d1, UFDouble d2) {
    UFDouble oper1 = MathTool.nvl(d1);
    UFDouble oper2 = MathTool.nvl(d2);
    
    // 如果有一个为零则认为符号相同
    if (isZero(oper1) || isZero(oper2)) {
    	return false;
    }
    boolean isNegative1 =  UFDouble.ZERO_DBL.compareTo(oper1) < 0;
    boolean isNegative2 =  UFDouble.ZERO_DBL.compareTo(oper2) < 0;
    
    return (isNegative1 && !isNegative2) || (!isNegative1 && isNegative2);
  }

  /**
   * 如果数值为空,则转化为0返回
   * 
   * @param d 要计算的数值
   * @return 数值为null时,返回0。否则返回元数值
   */
  public static UFDouble nvl(UFDouble d) {
    return d == null ? UFDouble.ZERO_DBL : d;
  }

  /**
   * 数值取绝对值。如果数值为空,则转化为0返回
   * 
   * @param d 要计算的数值
   * @return 数值的绝对值
   */
  public static UFDouble abs(UFDouble d) {
    return MathTool.nvl(d).abs();
  }

  /**
   * 数值是否为0。数值为null时,作为0对待
   * 
   * @param d 要计算的数值
   * @return 数值为null或者等于0时返回真
   */
  public static boolean isZero(UFDouble d) {
    return MathTool.equals(d, UFDouble.ZERO_DBL);
  }

  /**
   * 数值取反。
   * 
   * @param d 要计算的数值
   * @return 与参数符号相反的数.如果参数为null,则返回0
   */
  public static UFDouble oppose(UFDouble d) {
    return MathTool.sub(UFDouble.ZERO_DBL, d);
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值