/*
 *    Copyright 2012-2013 The Haohui Network Corporation
 */
package com.haohui.b2b.util;

import java.math.BigDecimal;

/**
 * 货币计算的辅助类
 * 
 * @project haohui-b2b
 * @author cevencheng
 * @create 2012-5-1 下午6:06:52
 */
public class CurrencyUtil {
	private static final int DEF_DIV_SCALE = 10;  
	  
    /** 
     * 提供精确的加法运算  
     * @param v1 被加数 
     * @param v2 加数 
     * @return 两个参数的和 
     */  
    public static double add(double v1, double v2) {  
        BigDecimal b1 = new BigDecimal(Double.toString(v1));  
        BigDecimal b2 = new BigDecimal(Double.toString(v2));  
        return b1.add(b2).doubleValue();  
    }  
      
    /** 
     * 提供精确的减法运算  
     * @param v1 被减数 
     * @param v2 减数 
     * @return 两个参数的差 
     */  
    public static double substract(double v1, double v2) {  
        BigDecimal b1 = new BigDecimal(Double.toString(v1));  
        BigDecimal b2 = new BigDecimal(Double.toString(v2));  
        return b1.subtract(b2).doubleValue();  
    }  
      
    /** 
     * 提供精确的乘法运算 
     * @param v1 被乘数 
     * @param v2 乘数 
     * @return 两个参数的积 
     */  
    public static double multiply(double v1, double v2) {  
        BigDecimal b1 = new BigDecimal(Double.toString(v1));  
        BigDecimal b2 = new BigDecimal(Double.toString(v2));  
        return b1.multiply(b2).doubleValue();  
    }  
  
    /** 
     * 提供(相对)精确的除法运算,当发生除不尽的情况时, 
     * 精确到小数点以后10位,以后的数字四舍五入. 
     * @param v1 被除数 
     * @param v2 除数 
     * @return 两个参数的商 
     */  
    public static double divide(double v1, double v2) {  
        return divide(v1, v2, DEF_DIV_SCALE);  
    }  
  
    /** 
     * 提供(相对)精确的除法运算. 
     * 当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入. 
     *  
     * @param v1 被除数 
     * @param v2 除数 
     * @param scale 表示需要精确到小数点以后几位 
     * @return 两个参数的商 
     */  
    public static double divide(double v1, double v2, int scale) {  
        if (scale < 0) {  
            throw new IllegalArgumentException("The scale must be a positive integer or zero");  
        }  
          
        BigDecimal b1 = new BigDecimal(Double.toString(v1));  
        BigDecimal b2 = new BigDecimal(Double.toString(v2));  
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();  
    }  
  
    /** 
     * 提供精确的小数位四舍五入处理 
     * @param v 需要四舍五入的数字 
     * @param scale 小数点后保留几位 
     * @return 四舍五入后的结果 
     */  
    public static double round(double v, int scale) {  
        if (scale < 0) {  
            throw new IllegalArgumentException("The scale must be a positive integer or zero");  
        }  
          
        BigDecimal b = new BigDecimal(Double.toString(v));  
        BigDecimal one = new BigDecimal("1");  
        return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();  
    }  
  
      
     public static void main(String[] args) {  
         //直接使用浮点数进行计算,得到的结果是有问题的  
         System.out.println(0.01 + 0.05);  
         
         System.out.println(CurrencyUtil.add(0.01, 0.05));  
           
         //使用了BigDecimal类进行计算后,可以做到精确计算  
         System.out.println(CurrencyUtil.add(0.0000000000005, 0.00000001)); 
         
         System.out.println("总价:" + CurrencyUtil.multiply(2.1, 100));
    }  
}
最近下载更多
1521010719  LV1 2021年1月28日
三寸21212121  LV1 2020年7月16日
gds123456  LV1 2020年4月1日
cxp1zzzzzz  LV1 2020年2月26日
1430794472  LV1 2020年1月8日
wzqq5517992  LV1 2019年12月22日
wkc  LV21 2018年5月13日
scpcyzxb  LV16 2017年6月14日
willralf  LV21 2015年8月18日
Silvermoon  LV10 2014年8月5日
最近浏览更多
Killah  LV9 2021年4月16日
2196316269  LV10 2021年2月25日
1521010719  LV1 2021年1月28日
dongzhan  LV12 2020年12月22日
就为了好玩 2020年11月10日
暂无贡献等级
zxx_hello  LV6 2020年9月3日
亚历山大大帝  LV5 2020年7月18日
三寸21212121  LV1 2020年7月16日
Gyq灬ming  LV11 2020年6月4日
xingbing  LV9 2020年4月27日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友