码迷,mamicode.com
首页 > 其他好文 > 详细

高精度的运算的NumberUtils

时间:2018-03-08 02:35:22      阅读:213      评论:0      收藏:0      [点我收藏+]

标签:eof   gpo   apache   tip   指定   otc   ret   argument   sub   

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

标签:eof   gpo   apache   tip   指定   otc   ret   argument   sub   

原文地址:https://www.cnblogs.com/jtz-79879/p/8526028.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!