java金额类计算封装


import java.math.BigDecimal;
import java.math.BigInteger;


/**
 * 
 * @Description:TODO
 * @author:     ZhangHaiXiang
 * @date:       2014年7月20日
 */
public class Money {

public static final Money zero = new Money(0);


/**
* 操作数
*/
private BigDecimal opr1;
/**
* 默认精度(可根据实际需要修改)
*/
private static final int DEFAULT_SCALE = 2;


public Money(int amt) {
opr1 = new BigDecimal(amt);
}


public Money(long amt) {
opr1 = new BigDecimal(amt);
}


public Money(double amt) {
opr1 = new BigDecimal(Double.toString(amt));
}


public Money(String amt) {
if (amt == null || amt.isEmpty()) {
opr1 = new BigDecimal(0);
} else {
opr1 = new BigDecimal(amt);
}
}


public Money(BigInteger amt) {
opr1 = new BigDecimal(amt);
}


public Money(BigDecimal amt) {
opr1 = amt;
}


/**
* 获取值

* @return
*/
BigDecimal getOpr() {
return opr1;
}


/**
* 返回值
*/
public String toString() {
return opr1.toString();
}


/**
* 金额相加

* @param opr2
*            相加金额,支持多个金额参数
* @return
*/
public Money add(Money... opr2) {
BigDecimal result = opr1;
for (Money tmp : opr2) {
result = result.add(tmp.opr1);
}
return new Money(result);
}


/**
* 金额相减

* @param opr2
*            相减金额,支持多个金额参数
* @return
*/
public Money sub(Money... opr2) {
BigDecimal result = opr1;
for (Money tmp : opr2) {
result = result.subtract(tmp.opr1);
}
return new Money(result);
}


/**
* 金额相乘,最后对相乘结果进行按最后结果按默认精度2进行四舍五入处理

* @param opr2
*            相乘金额,支持多个金额参数
* @return
*/
public Money mulAndRound(Money... opr2) {
BigDecimal result = opr1;
for (Money tmp : opr2) {
result = result.multiply(tmp.opr1);
}
result = result.divide(new BigDecimal("1"), DEFAULT_SCALE,
BigDecimal.ROUND_HALF_UP);
return new Money(result);
}

/**
* 金额相乘

* @param opr2
*            相乘金额,支持多个金额参数
* @return
*/
public Money mul(Money... opr2) {
BigDecimal result = opr1;
for (Money tmp : opr2) {
result = result.multiply(tmp.opr1);
}
return new Money(result);
}

/**
* 金额相乘,最后对相乘结果进行按最后结果按指定精度scale进行四舍五入处理

* @param scale
*            保留精度
* @param opr2
*            相乘金额,支持多个金额参数
* @return
*/
public Money mulAndRound(int scale, Money... opr2) {
BigDecimal result = opr1;
for (Money tmp : opr2) {
result = result.multiply(tmp.opr1);
}

result = result.divide(new BigDecimal("1"), scale,
BigDecimal.ROUND_HALF_UP);
return new Money(result);
}

/**
* 金额相除 </br>
* 如果相除金额参数个数等于1时,当发生除不尽的情况时,按指定精度scale进行四舍五入处理。</br>
* 如果相除金额参数个数大于1时,当发生除不尽的情况时,按指定精度2*scale进行四舍五入处理,最后结果按指定精度scale进行四舍五入处理。</br>

* @param scale
*            保留精度
* @param opr2
*            相除金额,支持多个金额参数
* @return
*/
public Money div(int scale, Money... opr2) {
if( opr2.length == 1 ) {
return new Money(opr1.divide(opr2[0].opr1, scale,
BigDecimal.ROUND_HALF_UP));
}


BigDecimal result = opr1;
for (Money tmp : opr2) {
result = result.divide(tmp.opr1, scale * 2,
BigDecimal.ROUND_HALF_UP);
}
result = result.divide(new BigDecimal("1"), scale,
BigDecimal.ROUND_HALF_UP);
return new Money(result);
}


/**
* 金额相除</br>
* 如果相除金额参数个数等于1时,当发生除不尽的情况时,按默认精度2进行四舍五入处理。</br>
* 如果相除金额参数个数大于1时,当发生除不尽的情况时,按默认精度2*2进行四舍五入处理,最后结果按默认精度2进行四舍五入处理。</br>

* @param opr2
*            相除金额,支持多个金额参数
* @return
*/
public Money div(Money... opr2) {
if( opr2.length == 1 ) {
return new Money(opr1.divide(opr2[0].opr1, DEFAULT_SCALE,
BigDecimal.ROUND_HALF_UP));
}

BigDecimal result = opr1;
for (Money tmp : opr2) {
result = result.divide(tmp.opr1, DEFAULT_SCALE * 2,
BigDecimal.ROUND_HALF_UP);
}
result = result.divide(new BigDecimal("1"), DEFAULT_SCALE,
BigDecimal.ROUND_HALF_UP);
return new Money(result);
}


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

* @param scale
*            保留精度
* @return
*/
public Money round(int scale) {
return new Money(opr1.divide(new BigDecimal("1"), scale,
BigDecimal.ROUND_HALF_UP));
}


/**
* 提供精确的小数位四舍五入处理,默认精度为2

* @param opr2
*            相除金额
* @param scale
*            保留精度
* @return
*/
public Money round() {
return new Money(opr1.divide(new BigDecimal("1"), DEFAULT_SCALE,
BigDecimal.ROUND_HALF_UP));
}


/**
* 金额比较

* @param opr2
*            比较金额
* @return opr1小于、等于或大于 opr2 时,返回 -1、0 或 1。
*/
public int compareTo(Money opr2) {
return opr1.compareTo(opr2.getOpr());
}


/**
* 取金额最小

* @param opr2 ,支持多个金额参数
* @return
*/
public Money min(Money... opr2) {
BigDecimal tmp1 = opr1;
for (Money tmp : opr2) {
tmp1 = tmp1.min(tmp.opr1);
}
return new Money(tmp1);
}


/**
* 取金额最大

* @param opr2 ,支持多个金额参数
* @return
*/
public Money max(Money... opr2) {
BigDecimal tmp1 = opr1;
for (Money tmp : opr2) {
tmp1 = tmp1.max(tmp.opr1);
}
return new Money(tmp1);
}

public double value() {
return opr1.doubleValue();
}

}

猜你喜欢

转载自blog.csdn.net/tracy38/article/details/51241821
今日推荐