有精度要求的数字操作工具类(BigDecimal操作)

注意:在互联网行业,对于金额有比较严格的精度要求,因此在工作中使用BigDecimal来操作金额。

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

/**
 * 有精度要求的数字操作工具类
 *
 * @author wuqiang
 * @since 2016-04-06
 *
 */
public class NumberOperateUtil {
    
    private static int ROUND_HALF_UP = BigDecimal.ROUND_HALF_UP;//四舍五入
    
    /**
     * 将数字字符串转化为BigDecimal
     *
     * @param str 数字字符串
     *
     * @return BigDecimal
     */
    public static BigDecimal getBigDecimalForStr(String str){
        return new BigDecimal(str);
    }
    
    /**
     * 将数字字符串转化为double,并保留指定小数位
     *
     * @param str 数字字符串
     * @param scale 指定要保留的小数位(可为空)
     *
     * @return double
     */
    public static double getBigDecimalForStrReturnDouble(String str,Integer scale){
        BigDecimal one = getBigDecimalForStr(str);
        if(null != scale){
            return one.setScale(scale, ROUND_HALF_UP).doubleValue();
        }
        return one.doubleValue();
    }
    
    /**
     * 将double类型数字转化为BigDecimal
     *
     * @param str 数字字符串
     *
     * @return BigDecimal
     */
    public static BigDecimal getBigDecimalForDouble(double one){
        return getBigDecimalForStr(one + "");
    }
    
    /**
     * 获取指定小数位的double
     *
     * @param one 数字
     *
     * @return double
     */
    public static double getScaleDouble(double one,Integer scale){
        return getBigDecimalForStrReturnDouble(one + "", scale);
    }
    
    /**
     * 获取2位小数点的double
     *
     * @param one 数字
     * @return double
     */
    public static double getScaleDouble(double one){
        return getScaleDouble(one, 2);
    }
    
    /**
     * 获取货币格式化字符串(¥#.###.##)
     *
     * @param one 数字
     *
     * @return String
     */
    public static String getCurrencyFormat(BigDecimal one){
        NumberFormat currency = NumberFormat.getCurrencyInstance(); //建立货币格式化引用
        return currency.format(one);
    }
    
    /**
     * 获取货币格式化字符串(¥#.###.##)
     *
     * @param one 数字
     *
     * @return String
     */
    public static String getCurrencyFormat(double one){
        return getCurrencyFormat(getBigDecimalForStr(one + ""));
    }
    
    /**
     * 两个BigDecimal数字相加
     *
     * @param one 第一个数字
     * @param two 第二个数字
     *
     * @return BigDecimal
     */
    public static BigDecimal add(BigDecimal one,BigDecimal two){
        return one.add(two);//相加
    }
    
    /**
     * 两个数字字符串相加
     *
     * @param oneNumber 第一个数字字符串
     * @param twoNumber 第二个数字字符串
     *
     * @return BigDecimal
     */
    public static BigDecimal add(String oneNumber,String twoNumber){
        BigDecimal one = new BigDecimal(oneNumber);
        BigDecimal two = new BigDecimal(twoNumber);
        return add(one, two);
    }
    
    /**
     * 两个double数字相加
     *
     * @param oneNumber 第一个数字
     * @param twoNumber 第二个数字
     *
     * @return BigDecimal
     */
    public static BigDecimal add(double oneNumber,double twoNumber){
        return add(oneNumber + "", twoNumber + "");
    }
    
    /**
     * 两个double数字相加并保留指定小数位
     *
     * @param one 第一个数字
     * @param two 第二个数字
     * @param scale 指定要保留的小数位(可为空)
     *
     * @return BigDecimal
     */
    public static double add(double one,double two,Integer scale){
        BigDecimal b = add(one, two);
        if(null != scale){
            return b.setScale(scale, ROUND_HALF_UP).doubleValue();
        }
        return b.doubleValue();
    }
    
    /**
     * 两个数字字符串相加并保留指定小数位
     *
     * @param oneNumber 第一个数字字符串
     * @param twoNumber 第二个数字字符串
     * @param scale 指定要保留的小数位(可为空)
     *
     * @return double
     */
    public static double addReturnDouble(String oneNumber,String twoNumber,Integer scale){
        BigDecimal b = add(oneNumber, twoNumber);
        if(null != scale){
            return b.setScale(scale, ROUND_HALF_UP).doubleValue();
        }
        return b.doubleValue();
    }
    
    /**
     * 两个BigDecimal数字相减
     *
     * @param one 第一个数
     * @param two 第二个数
     * @param scale 指定小数位
     *
     * @return BigDecimal
     */
    public static BigDecimal subtract(BigDecimal one,BigDecimal two){        
        return one.subtract(two);//相减
    }
    
    /**
     * 两个BigDecimal数字相减并保留指定小数位
     *
     * @param one 第一个数
     * @param two 第二个数
     * @param scale 指定小数位(可为空)
     *
     * @return double
     */
    public static double subtractReturnDouble(BigDecimal one,BigDecimal two,Integer scale){
        BigDecimal b = subtract(one, two);
        if(null != scale){
            return b.setScale(scale, ROUND_HALF_UP).doubleValue();
        }
        return b.doubleValue();
    }
    
    /**
     * 两个数字字符串相减
     *
     * @param oneNumber 第一个数字字符串
     * @param twoNumber 第二个数字字符串
     * @param scale 指定小数位
     *
     * @return BigDecimal
     */
    public static BigDecimal subtract(String oneNumber,String twoNumber){
        BigDecimal one = new BigDecimal(oneNumber);
        BigDecimal two = new BigDecimal(twoNumber);
        return subtract(one, two);
    }
    
    /**
     * 两个数字相减并保留指定小数位
     *
     * @param oneNumber 第一个数字
     * @param twoNumber 第二个数字
     * @param scale 指定小数位(可为空)
     *
     * @return double
     */
    public static double subtractReturnDouble(double oneNumber,double twoNumber,Integer scale){
        BigDecimal one = new BigDecimal(oneNumber + "");
        BigDecimal two = new BigDecimal(twoNumber + "");
        return subtractReturnDouble(one, two, scale);
    }  

}

posted @ 2016-04-07 10:36  wuq126  阅读(1089)  评论(0编辑  收藏  举报