当我们的程序中用到计算的时候,最好把金额、数字使用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)); } }