当我们的程序中用到计算的时候,最好把金额、数字使用java.math.BigDecimal来定义。

一下是工具类:

View Code

package com.pingan.saims.scms.fundplan.util;

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

import com.opensymphony.oscache.util.StringUtil;

/**BigDecimal 对应的加减乘除、格式化等方法<br />
* 路人甲
* @author EX-CHENWEIXIAN001
*2012-11-8
*/
public class NumberUtils {

/**
* 默认返回小数2位
*/
public static final int DEFAULT_SCALE = 2;

/**
* 提供精确的加法运算。
*
* @param v1 被加数
* @param v2 加数
* @return 两个参数的和
*/
public static BigDecimal add(BigDecimal b1, BigDecimal b2) {
return b1.add(b2);
}

/**
* 提供精确的减法运算。
*
* @param v1 被减数
* @param v2 减数
* @return 两个参数的差
*/
public static BigDecimal sub(BigDecimal b1, BigDecimal b2) {
return b1.subtract(b2);
}

/**
* 提供精确的乘法运算。
*
* @param v1 被乘数
* @param v2 乘数
* @return 两个参数的积
*/
public static BigDecimal mul(BigDecimal b1, BigDecimal b2) {
return b1.multiply(b2);
}

/**
* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入。
*
* @param v1 被除数
* @param v2 除数
* @return 两个参数的商
*/
public static BigDecimal div(BigDecimal b1, BigDecimal b2) {
return div(b1, b2, DEFAULT_SCALE);
}

/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。
*
* @param v1 被除数
* @param v2 除数
* @param scale 表示表示需要精确到小数点以后几位。
* @return 两个参数的商
*/
public static BigDecimal div(BigDecimal b1, BigDecimal b2, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("默认小数位必须大于或者0!");
}
return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP);
}

/**
* 提供精确的小数位四舍五入处理。
*
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return 四舍五入后的结果
*/
public static BigDecimal round(BigDecimal b, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("默认小数位必须大于或者0!");
}
BigDecimal one = new BigDecimal("1");
return b.divide(one, scale, BigDecimal.ROUND_HALF_UP);
}

/**
* 格式化信息内容
*
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return 格式化后的结果
*/
public static String format(BigDecimal b, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("默认小数位必须大于或者0!");
}
StringBuffer formatString = new StringBuffer("###,##0");
if (scale > 0)
{
formatString.append(".");
for (int i = 0; i < scale; i++)
{
formatString.append("0");
}
}
NumberFormat numberFormat = new DecimalFormat(formatString.toString());

return numberFormat.format(b);
}

/**字符串转换为数据类型
*
* @param str
* @return
*/
public static BigDecimal stringToBigDecimal(String str)
{
if (!StringUtil.isEmpty(str))
{
return new BigDecimal(str);
}
return null;
}
/**
* 测试
*
* @param args
*/
public static void main(String[] args) {
BigDecimal v1 = new BigDecimal("10.58");
BigDecimal v2 = new BigDecimal("5");
BigDecimal v3 = new BigDecimal("5555555555.2722222226");
System.out.println(NumberUtils.add(v1, v2));
System.out.println(NumberUtils.sub(v1, v2));
System.out.println(NumberUtils.mul(v1, v2));
System.out.println(NumberUtils.div(v1, v2));
System.out.println(NumberUtils.div(v1, v2,3));
System.out.println(NumberUtils.round(v3, 1));
System.out.println(NumberUtils.format(v3, 5));

}
}