Java精确运算工具类 主要用于 //银行家舍入法

import java.math.BigDecimal;

/**
 * 
 * BigDecimal工具类 主要用于 //银行家舍入法
 * 
    1. 被修约的数字小于5时,该数字舍去;
    2. 被修约的数字大于5时,则进位;
    3. 被修约的数字等于5时,要看5前面的数字,若是奇数则进位,若是偶数则将5舍掉,即修约后末尾数字都成为偶数;
        若5的后面还有不为“0”的任何数,则此时无论5的前面是奇数还是偶数,均应进位。
    举例,用上述规则对下列数据保留小数点后两位数据:
    9.8249=9.82, 9.82671=9.83
    9.8350=9.84, 9.8351 =9.84
    9.8250=9.82, 9.82501=9.83
    
 * @author lut
 * @see
 */
public class BigDecimalUtil {
    
    private static int ROUND_HALF_EVEN = BigDecimal.ROUND_HALF_EVEN;//银行家舍入法
    
    
    /**
     * 将数字字符串转化为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_EVEN).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);
    }
    
    /**
     * 两个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_EVEN).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_EVEN).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_EVEN).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);
    }   
    
    /**
     * 两个数字相乘并保留指定小数位
     * 
     * @param oneNumber 第一个数字
     * @param twoNumber 第二个数字
     * @param scale 指定小数位(可为空)
     * 
     * @return double
     */
    public static double multiplyReturnDouble(double oneNumber, double twoNumber,Integer scale) {  
         BigDecimal one = new BigDecimal(oneNumber + "");
         BigDecimal two = new BigDecimal(twoNumber + "");
         return multiplyReturnDouble(one, two, scale);
    }  
    /**
     * 两个字符串相乘并保留指定小数位
     * 
     * @param oneNumber 第一个字符串
     * @param twoNumber 第二个字符串
     * @param scale 指定小数位(可为空)
     * 
     * @return double
     */
    public static double multiplyReturnDouble(String oneNumber, String twoNumber,Integer scale) {  
        BigDecimal one = new BigDecimal(oneNumber);
        BigDecimal two = new BigDecimal(twoNumber);
        return multiplyReturnDouble(one, two, scale);
    }  
    
    /**
     * 两个BigDecimal数字相乘并保留指定小数位
     * 
     * @param one 第一个数
     * @param two 第二个数
     * @param scale 指定小数位(可为空)
     * 
     * @return double
     */
    public static double multiplyReturnDouble( BigDecimal one,BigDecimal two,Integer scale){
         BigDecimal b = one.multiply(two);
         if(null != scale){
             return b.setScale(scale, ROUND_HALF_EVEN).doubleValue();
         }
         return b.doubleValue();
    }
    
    /**
     * 两个数字相除并保留指定小数位
     * 
     * @param oneNumber 第一个数字
     * @param twoNumber 第二个数字
     * @param scale 指定小数位(可为空)
     * 
     * @return double
     */
    public static double divideReturnDouble(double oneNumber, double twoNumber,Integer scale) {  
        BigDecimal one = new BigDecimal(oneNumber + "");
        BigDecimal two = new BigDecimal(twoNumber + "");
        return divideReturnDouble(one, two, scale);
    }  
    /**
     * 两个字符串相除并保留指定小数位
     * 
     * @param oneNumber 第一个字符串
     * @param twoNumber 第二个字符串
     * @param scale 指定小数位(可为空)
     * 
     * @return double
     */
    public static double divideReturnDouble(String oneNumber, String twoNumber,Integer scale) {  
        BigDecimal one = new BigDecimal(oneNumber);
        BigDecimal two = new BigDecimal(twoNumber);
        return divideReturnDouble(one, two, scale);
    }  
    
    /**
     * 两个BigDecimal数字相除并保留指定小数位
     * 
     * @param one 第一个数
     * @param two 第二个数
     * @param scale 指定小数位(可为空)
     * 
     * @return double
     */
    public static double divideReturnDouble( BigDecimal one,BigDecimal two,Integer scale){
        return one.divide(two,scale,ROUND_HALF_EVEN).doubleValue();
    }

你可能感兴趣的:(工具类)