1. 程式人生 > >高精度的運算的NumberUtils

高精度的運算的NumberUtils

pri isn 功能說明 round IT cal format atd true

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 "";
}
}

高精度的運算的NumberUtils