java数学运算

java数学运算

/**
 * Copyright (C) DXHM 版权所有
 * @文件名 MathExtend.java
 * @包名 dxt.financemanage.comm.util
 * @说明 TODO(描述文件做什么)
 * @作者 XieZhenGuo
 * @时间 Dec 11, 2010 3:37:38 PM
 * @版本 V1.0
 */
package cn.util;


import java.math.BigDecimal;
import java.text.DecimalFormat;


/**
 * @类名 MathExtend
 * @描述 科学计数法
 * @作者 XieZhenGuo
 * @日期 Dec 11, 2010 3:37:38 PM ========修改日志=======
 * 
 */
public class MathExtend {
// 默认除法运算精度
private static final int DEFAULT_DIV_SCALE = 2;


/**

* 提供精确的加法运算

* @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

* @return 两个参数数学加和,以字符串格式返回

*/
public static String add(String v1, String v2) {
if ("".equals(v1) || null == v1||"null".equals(v1)) {
v1 = "0";
}
if ("".equals(v2) || null == v2||"null".equals(v2)) {
v2 = "0";
}
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.add(b2).toString();
}


/**

* 提供精确的减法运算

* @param v1

* @param v2

* @return 两个参数的差

*/


public static double subtract(double v1, double v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.subtract(b2).doubleValue();
}


/**

* 提供精确的减法运算

* @param v1

* @param v2

* @return 两个参数数学差,以字符串格式返回

*/
public static String subtract(String v1, String v2) {
if ("".equals(v1) || null == v1) {
v1 = "0";
}
if ("".equals(v2) || null == v2) {
v2 = "0";
}
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.subtract(b2).toString();
}


/**

* 提供精确的乘法运算

* @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

* @return 两个参数的数学积,以字符串格式返回

*/


public static String multiply(String v1, String v2) {
if ("".equals(v1) || null == v1) {
v1 = "0";
}
if ("".equals(v2) || null == v2) {
v2 = "0";
}
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.multiply(b2).toString();
}


/**

* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到

* 小数点以后DEFAULT_DIV_SCALE位,以后的数字四舍五入,舍入模式采用ROUND_HALF_EVEN

* @param v1

* @param v2

* @return 两个参数的商

*/
public static double divide(double v1, double v2) {
return divide(v1, v2, DEFAULT_DIV_SCALE);
}


/**

* 提供(相对)精确的除法运算当发生除不尽的情况时,由scale参数指

* 定精度,以后的数字四舍五入舍入模式采用ROUND_HALF_EVEN

* @param v1

* @param v2

* @param scale
*            表示需要精确到小数点以后几位

* @return 两个参数的商

*/
public static double divide(double v1, double v2, int scale) {
return divide(v1, v2, scale, BigDecimal.ROUND_HALF_EVEN);
}


/**

* 提供(相对)精确的除法运算当发生除不尽的情况时,由scale参数指

* 定精度,以后的数字四舍五入舍入模式采用用户指定舍入模式

* @param v1

* @param v2

* @param scale
*            表示需要精确到小数点以后几位

* @param round_mode
*            表示用户指定的舍入模式

* @return 两个参数的商

*/


public static double divide(double v1, double v2, int scale, int round_mode) {
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, round_mode).doubleValue();
}


/**

* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到

* 小数点以后10位,以后的数字四舍五入,舍入模式采用ROUND_HALF_EVEN

* @param v1

* @param v2

* @return 两个参数的商,以字符串格式返回

*/
public static String divide(String v1, String v2) {
return divide(v1, v2, DEFAULT_DIV_SCALE);
}


/**

* 提供(相对)精确的除法运算当发生除不尽的情况时,由scale参数指

* 定精度,以后的数字四舍五入舍入模式采用ROUND_HALF_EVEN

* @param v1

* @param v2

* @param scale
*            表示需要精确到小数点以后几位

* @return 两个参数的商,以字符串格式返回

*/
public static String divide(String v1, String v2, int scale) {
return divide(v1, v2, DEFAULT_DIV_SCALE, BigDecimal.ROUND_HALF_EVEN);
}


public static String divides(String v1, String v2, int scale) {
return divide(v1, v2, scale, BigDecimal.ROUND_HALF_EVEN);
}




public static String dividePercent(String v1, String v2, int scale) {
String tempString=divide(v1, v2, scale, BigDecimal.ROUND_HALF_UP);
return  multiply(tempString, "100");
}

/**

* 提供(相对)精确的除法运算当发生除不尽的情况时,由scale参数指

* 定精度,以后的数字四舍五入舍入模式采用用户指定舍入模式

* @param v1

* @param v2

* @param scale
*            表示需要精确到小数点以后几位

* @param round_mode
*            表示用户指定的舍入模式

* @return 两个参数的商,以字符串格式返回

*/
public static String divide(String v1, String v2, int scale, int round_mode) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
if ("".equals(v1) || null == v1 || "null" == v1) {
v1 = "0";
return "";
}
if ("".equals(v2) || null == v2  || "null" == v2) {
v2 = "0";
return "";
}
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.divide(b2, scale, round_mode).toString();
}


/**

* 提供精确的小数位四舍五入处理,舍入模式采用ROUND_HALF_EVEN

* @param v
*            需要四舍五入的数字

* @param scale
*            小数点后保留几位

* @return 四舍五入后的结果

*/
public static double round(double v, int scale) {
return round(v, scale, BigDecimal.ROUND_HALF_EVEN);
}


/**

* 提供精确的小数位四舍五入处理

* @param v
*            需要四舍五入的数字

* @param scale
*            小数点后保留几位

* @param round_mode
*            指定的舍入模式

* @return 四舍五入后的结果

*/
public static double round(double v, int scale, int round_mode) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(v);
return b.setScale(scale, round_mode).doubleValue();
}


/**

* 提供精确的小数位四舍五入处理,舍入模式采用ROUND_HALF_UP

* @param v
*            需要四舍五入的数字

* @param scale
*            小数点后保留几位

* @return 四舍五入后的结果,以字符串格式返回

*/
public static String round(String v, int scale) {
return round(v, scale, BigDecimal.ROUND_HALF_UP);
}


/**

* 提供精确的小数位四舍五入处理

* @param v
*            需要四舍五入的数字

* @param scale
*            小数点后保留几位

* @param round_mode
*            指定的舍入模式

* @return 四舍五入后的结果,以字符串格式返回

*/
public static String round(String v, int scale, int round_mode) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
if ("".equals(v) || null == v) {
v = "0";
}
BigDecimal b = new BigDecimal(v);
return b.setScale(scale, round_mode).toString();
}


/**

* @名称 moneyStr
* @描述 金额转换
* @作者 XieZhenGuo
* @时间 Feb 24, 2011 11:16:28 AM
* @@param money
* @@return
*/
public static String moneyStr(String money) {
if ("".equals(money) || null == money) {
money = "0.00";
}
DecimalFormat myFormat = new DecimalFormat("#,##0.00");
String temp = myFormat.format(Double.valueOf(money));
return temp;
}


/**

* @名称 moneyStr
* @描述 金额转换
* @作者 XieZhenGuo
* @时间 Feb 24, 2011 11:16:28 AM
* @@param money
* @@return
*/
public static String moneyStr(Double money) {
DecimalFormat myFormat = new DecimalFormat("#,##0.00");
String temp = myFormat.format(money);
return temp;
}
/**

* 方法描述: 保留六位小数
* @param money
* @return
* String
* @author rjq
* @date Nov 9, 2015 4:19:13 PM
*/
public static String moneyStrForTen(String money) {
if ("".equals(money) || null == money) {
money = "0.000000";
}
DecimalFormat myFormat = new DecimalFormat("#,##0.000000");
String temp = myFormat.format(Double.valueOf(money));
return temp;
}


/**

* @名称 comparison
* @描述 两个数字进行比较
* @作者 XieZhenGuo
* @时间 Apr 1, 2011 10:20:10 AM
* @param v1
* @param v2
* @return 0:相等;1:大于;-1:小于
*/
public static int comparison(String v1, String v2) {
int rflag = 0;
if ("".equals(v1) || null == v1) {
v1 = "0";
}
if ("".equals(v2) || null == v2) {
v2 = "0";
}
BigDecimal a = new BigDecimal(v1);
BigDecimal b = new BigDecimal(v2);
rflag = a.compareTo(b);
return rflag;
}
/**
* 格式化金额,例如:562.007200 格式化后是 562.0072
*/
public static String getFormatMoney(String str){




String strq = "";
String strh = "";
char strchar;
String strTmp = "";
String Tmp = "";

String[] strArr = str.split("\\.");
strq = strArr[0];
strh = strArr[1];
int m = strh.length(); 
for (int i = strh.length()-1; i >=0; i--) {
strchar = strh.charAt(i);
strTmp = strTmp + strchar;
Tmp = Tmp + "0";
if(strTmp.equals(Tmp)){
m = i;
}
}
if(m==0){
strTmp = strq;
}else{
strTmp = strq+"."+strh.substring(0,m);
}
return strTmp;
}
/**

* 方法描述: 格式化金额成万元格式 
* @param str
* @return
* String
* @author rjq
* @date Nov 9, 2015 4:21:15 PM
*/
public static String getFormatMoneyForWanyuan(double fromAmt  ){

String str=String.valueOf(fromAmt);
String strTmp = getFormatMoneyForWanyuan(str);
return strTmp;
}
/**

* 方法描述: 格式化金额成万元格式 
* @param str
* @return
* String
* @author rjq
* @date Nov 9, 2015 4:21:15 PM
*/
public static String getFormatMoneyForWanyuan(String str){


str =divides(str, "10000", 6);
str=moneyStrForTen(str);

String strq = "";
String strh = "";
char strchar;
String strTmp = "";
String Tmp = "";
 
String[] strArr = str.split("\\.");
strq = strArr[0];
strh = strArr[1];
int m = strh.length();

for (int i = strh.length()-1; i >=0; i--) {
strchar = strh.charAt(i);
strTmp = strTmp + strchar;
Tmp = Tmp + "0";
if(strTmp.equals(Tmp)){
m = i;
}
}
if(m==0){
strTmp = strq;
}else{
strTmp = strq+"."+strh.substring(0,m);
}
return strTmp;
}

/**
* 方法描述: 转换成万元不带,
* @param str
* @return
* String
* @author YuShuai
* @date 2015-12-30 上午11:58:17
*/
public static String getFormatMoneyForWanyuanswt(String str){


str =divides(str, "10000", 6);
str=moneyStrForTenswt(str);

String strq = "";
String strh = "";
char strchar;
String strTmp = "";
String Tmp = "";
 
String[] strArr = str.split("\\.");
strq = strArr[0];
strh = strArr[1];
int m = strh.length();

for (int i = strh.length()-1; i >=0; i--) {
strchar = strh.charAt(i);
strTmp = strTmp + strchar;
Tmp = Tmp + "0";
if(strTmp.equals(Tmp)){
m = i;
}
}
if(m==0){
strTmp = strq;
}else{
strTmp = strq+"."+strh.substring(0,m);
}
return strTmp;
}

/**
* 方法描述: 保留6位小数不带,
* @param money
* @return
* String
* @author YuShuai
* @date 2015-12-30 上午11:58:52
*/
public static String moneyStrForTenswt(String money) {
if ("".equals(money) || null == money) {
money = "0.000000";
}
DecimalFormat myFormat = new DecimalFormat("###0.000000");
String temp = myFormat.format(Double.valueOf(money));
return temp;
}
public static void main(String[] args) {




}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值