高精度的运算的NumberUtils

package com.zjt.frame;

import java.math.BigDecimal;

import org.apache.commons.lang3.StringUtils;

/**
 * 
 * 功能说明: 提供高精度的运算支持. 所以函数以double为参数类型,兼容int与float.
 * 
 * @author admin
 */
public class NumberUtils {

   private NumberUtils() {

   }

   /**
    * 精确的加法运算.
    * 
    * @param v1
    * @param v2
    * @return
    */
   public static double add(double v1, double v2) {
      BigDecimal b1 = new BigDecimal(v1);
      BigDecimal b2 = new BigDecimal(v2);
      return b1.add(b2).doubleValue();
   }

   /**
    * 
    * 精确的减法运算.
    * 
    * @param v1
    *            被减数
    * @param v2
    *            减数
    */
   public static double subtract(double v1, double v2) {
      BigDecimal b1 = new BigDecimal(Double.toString(v1));
      BigDecimal b2 = new BigDecimal(Double.toString(v2));
      return b1.subtract(b2).doubleValue();
   }
   
   /**
    * 提供精确的乘法运算.
    * 
    * @param v1
    * @param v2
    * @return
    */
   public static double multiply(double v1, double v2) {
      BigDecimal b1 = new BigDecimal(v1);
      BigDecimal b2 = new BigDecimal(v2);
      return b1.multiply(b2).doubleValue();
   }
   
   /**
    * 提供精确的乘法运算,并对运算结果截位.
    * 
    * @param v1
    * @param v2
    * @param scale
    *            运算结果小数后精确的位数
    * @return
    */
   public static double multiply(double v1, double v2, int scale) {
      if (scale < 0) {
         throw new IllegalArgumentException("The scale must be a positive integer or zero");
      }
      BigDecimal b1 = new BigDecimal(v1);
      BigDecimal b2 = new BigDecimal(v2);
      return b1.multiply(b2).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
   }


   /**
    * 提供(相对)精确的除法运算.
    * 
    * @see #divide(double, double, int)
    * 
    * @param v1
    * @param v2
    * @return
    */
   public static double divide(double v1, double v2) {
      BigDecimal b1 = new BigDecimal(v1);
      BigDecimal b2 = new BigDecimal(v2);
      return b1.divide(b2).doubleValue();
   }

   /**
    * 提供(相对)精确的除法运算. 由scale参数指定精度,以后的数字四舍五入.
    * 
    * @param v1
    *            被除数
    * @param v2
    *            除数
    * @param scale
    *            表示表示需要精确到小数点以后几位
    */
   public static double divide(double v1, double v2, int scale) {
      if (scale < 0) {
         throw new IllegalArgumentException("The scale must be a positive integer or zero");
      }

      BigDecimal b1 = new BigDecimal(v1);
      BigDecimal b2 = new BigDecimal(v2);
      return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
   }
   
   /**
    * 提供精确的小数位四舍五入处理.
    * 
    * @param v
    *            需要四舍五入的数字
    * @param scale
    *            小数点后保留几位
    */
   public static double round(double v, int scale) {
      if (scale < 0) {
         throw new IllegalArgumentException("The scale must be a positive integer or zero");
      }
      BigDecimal b = new BigDecimal(v);
      return b.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
   }

   /**
    * 随机产生一个不大于max的随机整数
    * 
    * @param max
    * @return
    */
   public static long randomNumber(long max) {
      long tmp = System.currentTimeMillis();
      long x = tmp % max;
      return x;
   }

   public static boolean isNumeric(String str) {
      int dotCount = 0;
      boolean result = true;
      for (int i = str.length(); --i >= 0;) {
         char c = str.charAt(i);
         if (c == '.') {
            dotCount++;
            continue;
         }

         if (dotCount > 1) {
            result = false;
            break;
         }

         if (!Character.isDigit(str.charAt(i))) {
            result = false;
            break;
         }
      }
      return result;
   }

   /**
    * @desc 把金额由分转换成元
    * 
    * @param sFenStr
    *            金额(单位:分)
    * @return 金额(单位:元)
    */
   public static String getYuanStr(String sFenStr) {
      String Y = "0";// 元
      String J = "0";// 角
      String F = "0";// 分
      int len = sFenStr.length();
      if (len > 0) {
         F = sFenStr.substring(len - 1, len);
      }
      if (len > 1) {
         J = sFenStr.substring(len - 2, len - 1);
      }
      if (len > 2) {
         Y = sFenStr.substring(0, len - 2);
      }
      return Y + "." + J + F;
   }

   /**
    * 把金额由分转换成元 yb
    * 
    * @param sFenStr
    * @return
    */
   public static String getYuanStr2(String sFenStr) {
      if (StringUtils.isNotBlank(sFenStr)) {
         int i = Integer.valueOf(sFenStr);
         double j = (double) i / 100;
         return j + "";
      }
      return "0";
   }
   
   /**
    * 将20120626164400 转换位2012年06月26日 16:44:00
    * 
    * @param formateDate
    * @return
    */
   public static String getFormatDate(String formateDate) {
      String year = formateDate.substring(0, 4);
      String month = formateDate.substring(4, 6);
      String day = formateDate.substring(6, 8);
      String hour = formateDate.substring(8, 10);
      String min = formateDate.substring(10, 12);
      String second = formateDate.substring(12);
      return year + "年" + month + "月" + day + "日" + hour + ":" + min + ":" + second + "时";
   }

   /**
    * 功能说明:将秒转换为分
    * 
    * @param seconds
    * @return
    */
   public static String getFormateFen(String seconds) {
      if (StringUtils.isNotBlank(seconds)) {
         int m = Integer.parseInt(seconds) / 60;
         return m + "";
      }
      return "";
   }
   
   /**
    * 功能说明:将KB转换为M
    * 
    * @param strkb
    * @return
    */
   public static String getFormateM(String strkb) {
      if (StringUtils.isNotBlank(strkb)) {
         int m = Integer.parseInt(strkb) / 1024;
         return m + "";
      }
      return "";
   }
}

  

posted @ 2018-03-07 23:17  ●ら任┊逍遥  阅读(1023)  评论(0编辑  收藏  举报