`
xwood
  • 浏览: 104117 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

商业计算——BigDecimal

阅读更多
    BigDecimal表示不可变的、任意精度的有符号十进制数,由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成。所表示数字如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负 scale 次幂。因此,BigDecimal 表示的数值是 (unscaledValue × 10-scale)。
    另外,BigDecimal 类提供以下操作:算术、标度操作、舍入、比较、哈希算法和格式转换。toString() 方法提供 BigDecimal 的规范表示形式。
public class BigDecimalNewUtil {
	
	public static void main(String[] args){
		
		String val1 = "12.36547";
		String val2 = "1587.235";
		
		/*
		 * 加法1
		 * 
		 * MathContext有两个属性:
		 * precision:指定数字的有效位数。如1.256E+2,表示有效位数4位
		 * RoundingMode:指定在将数字转为有效位数时采用的舍入模式
		 */
		MathContext mctx = new MathContext(2, RoundingMode.HALF_UP);
		System.out.println("---- add method using MathContext:" + add(val1, val2, mctx));
		
		int scale = 3;		
		//在java 1.5之前,使用BigDecimal.roundingMode属性指定,如: int roundingMode = BigDecimal.ROUND_HALF_UP;
		RoundingMode roundingMode = RoundingMode.HALF_UP;
		
		//加法2
		System.out.println("---- add method using scale and RoundingMode:" + add(val1, val2, scale, roundingMode));
		
		//除法
		System.out.println("---- divide method using scale and RoundingMode:" + divide(val1, val2, scale, roundingMode));
		
		//舍入1
		System.out.println("---- round method using scale and RoundingMode:" + round(Double.parseDouble(val1), scale, roundingMode));
		
		/*
		 * 舍入2
		 * BigDecimal提供直接舍入方法,其结果与我们使用round()方法相同
		 */
		BigDecimal bval = new BigDecimal(val1);
		System.out.println("---- round method using BigDeciaml.setScale:" + bval.setScale(scale, roundingMode));
		
		
		/*----------------------运行结果如下--------------------
		*---- add method using MathContext:1.6E+3
		*---- add method using scale and RoundingMode:1599.6
		*---- divide method using scale and RoundingMode:0.0080
		*---- round method using scale and RoundingMode:12.365
		*---- round method using BigDeciaml.setScale:12.365
		*/
	}
	
	/**
     * 提供精确的加法运算
     * @param val1 被加数
     * @param val2 加数
     * @return 和
     */
    public static double add(String val1, String val2){
    	BigDecimal bval1= new BigDecimal(val1);
    	BigDecimal bval2 = new BigDecimal(val2);
    	return bval1.add(bval2).doubleValue();
    }
    
    /**
     * 提供带舍入模式的加法运算
     * @param val1 被加数
     * @param val2 加数
     * @param scale 舍入精度
     * @param roundingMode 舍入模式
     * @return 舍入和
     */
    public static double add(String val1, String val2, int scale, RoundingMode roundingMode){
    	BigDecimal bval1= new BigDecimal(val1);
    	BigDecimal bval2 = new BigDecimal(val2);
    	double val = bval1.add(bval2).doubleValue();
    	return round(val, scale, roundingMode);
    }
    
    /**
     * 提供指定和有效数字的加法运算
     * @param val1 被加数
     * @param val2 加数
     * @param mctx 指定和有效数字及舍入模式的context
     * @return 舍入和
     */
    public static String add(String val1, String val2, MathContext mctx){
    	BigDecimal bval1= new BigDecimal(val1);
    	BigDecimal bval2 = new BigDecimal(val2);
    	return bval1.add(bval2, mctx).toString();
    }
    
    /**
     * 提供精确的减法运算
     * @param val1 被减数
     * @param val2 减数
     * @return 差
     */
    public static double subtract(String val1, String val2){
    	BigDecimal bval1 = new BigDecimal(val1);
    	BigDecimal bval2 = new BigDecimal(val2);
    	return bval1.subtract(bval2).doubleValue();
    }
    
    /**
     * 提供舍入的减法运算
     * @param val1 被减数
     * @param val2 减数
     * @param scale 舍入精度
     * @param roundingMode 舍入模式
     * @return 舍入差
     */
    public static double subtract(String val1, String val2, int scale, RoundingMode roundingMode){
    	BigDecimal bval1 = new BigDecimal(val1);
    	BigDecimal bval2 = new BigDecimal(val2);
    	double val = bval1.subtract(bval2).doubleValue();
    	return round(val, scale, roundingMode);
    }
    
    /**
     * 提供精确的乘法运算
     * @param val1 被乘数
     * @param val2 乘数
     * @return 积
     */
    public static double multiply(String val1, String val2){
    	BigDecimal bval1 = new BigDecimal(val1);
    	BigDecimal bval2 = new BigDecimal(val2);
    	return bval1.multiply(bval2).doubleValue();
    }
    
    /**
     * 提供舍入的乘法运算
     * @param val1 被乘数
     * @param val2 乘数
     * @param scale 舍入精度
     * @param roundingMode 舍入模式
     * @return 舍入积
     */
    public static double multiply(String val1, String val2, int scale, RoundingMode roundingMode){
    	BigDecimal bval1 = new BigDecimal(val1);
    	BigDecimal bval2 = new BigDecimal(val2);
    	double val = bval1.multiply(bval2).doubleValue();
    	return round(val, scale, roundingMode);
    }
    
    /**
     * 提供带指定精度的除法
     * @param val1 被除数
     * @param val2 除数
     * @param scale 舍入精度
     * @param roundingMode 舍入模式
     * @return 舍入商
     */
    public static double divide(String val1, String val2, int scale, RoundingMode roundingMode){
    	if(scale < 0){
    		throw new IllegalArgumentException("The scale must be a positive integer or zero");
    	}
    	BigDecimal bval1= new BigDecimal(val1);
    	BigDecimal bval2 = new BigDecimal(val2);
    	return bval1.divide(bval2, scale, roundingMode).doubleValue();
    }
    
    /**
     * 提供精确的小数位舍入处理
     * @param val 需要舍入的数字
     * @param scale 小数点后保留几位
     * @param roundingMode 舍入模式
     * @return 舍入后的结果
     */
    public static double round(double val, int scale, RoundingMode roundingMode){
    	return divide(String.valueOf(val), "1", scale, roundingMode);
    }
    
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics