精确计算_double,BigDecimal

其它资源:http://blog.csdn.net/lhooouuu/article/details/7086880
在金额的计算中需要精确计算,而double肯定是不行的。BigDecimal的计算中也要注意一些问题。看案例:

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

import org.junit.Test;

/**
 * BigDecimal的加减乘除 注意的问题
 *  new BigDecimal(String  val ) ; new BigDecimal(double  val ) 
 * 为了防止精度出现偏离,建议使用参数为String类型的该构造方法。(见 test3)
 * @author Administrator
 *
 */
public class BigDecimalYunSuan {

    /**
     * double类运算出现的问题
     */
    @Test
    public void test1(){
        System.out.println(0.05+0.01);      //0.060000000000000005
        System.out.println(1.0 - 0.42);     //0.5800000000000001
        System.out.println(4.015 * 100);    //401.49999999999994
        System.out.println(123.3 / 100);    //1.2329999999999999
        //自动科学计数法
        System.out.println(9969999999.04);  //9.96999999904E9
        System.out.println(199999999.04);   //1.9999999904E8
        System.out.println(1000000011.01);  //1.00000001101E9
        System.out.println(9999999.04);     //9999999.04
    }

    /**
     * BigDecimal赋值出现的问题
     */
    @Test
    public void test2(){
        BigDecimal a = new BigDecimal(123456789.01);
        BigDecimal b = new BigDecimal("123456789.01");
        System.out.println(a);  //123456789.01000000536441802978515625
        System.out.println(b);  //123456789.01
    }

    /**
     * 除法一定要保留小数
     */
    @Test
    public void test3(){
        //正确结果应该=17.1768
        BigDecimal a = new BigDecimal(10.53);
        BigDecimal b = new BigDecimal(6.6468);
        BigDecimal add = a.add(b);              // +
        BigDecimal subtract = a.subtract(b);    // -
        BigDecimal multiply = a.multiply(b);    // *
        BigDecimal divide = a.divide(b,2,BigDecimal.ROUND_HALF_UP);     // /
        System.out.println(add);        //17.176799999999999180...
        System.out.println(subtract);   //3.8831999999999995409...
        System.out.println(multiply);   //69.990803999999993849...
        System.out.println(divide);     //1.58

        BigDecimal a1 = new BigDecimal("10.53");
        BigDecimal b1 = new BigDecimal("6.6468");
        BigDecimal add1 = a1.add(b1);           // +
        BigDecimal subtract1 = a1.subtract(b1); // -
        BigDecimal multiply1 = a1.multiply(b1); // *
        BigDecimal divide1 = a1.divide(b1,2,BigDecimal.ROUND_HALF_UP);      // /
        System.out.println(add1);       //17.1768
        System.out.println(subtract1);  //3.8832
        System.out.println(multiply1);  //69.990804
        System.out.println(divide1);    //1.58
    }

    /**
     * 格式化数值
     */
    @Test
    public void test4(){
        double format = 12343171.6; 

        //获取常规数值格式 
        NumberFormat number = NumberFormat.getNumberInstance(); 
        String str = number.format(format);//12,343,171.6 
        System.out.println(str);

        //获取整数数值格式 
        NumberFormat integer = NumberFormat.getIntegerInstance(); 
        str = integer.format(format);//如果带小数会四舍五入到整数12,343,172 
        System.out.println(str);

        //获取货币数值格式 
        NumberFormat currency = NumberFormat.getCurrencyInstance(); 
        currency.setMinimumFractionDigits(2);//设置数的小数部分所允许的最小位数(如果不足后面补0) 
        currency.setMaximumFractionDigits(4);//设置数的小数部分所允许的最大位数(如果超过会四舍五入) 
        str = currency.format(format);//¥12,343,171.60 
        System.out.println(str);

        //获取显示百分比的格式 
        NumberFormat percent = NumberFormat.getPercentInstance(); 
        percent.setMinimumFractionDigits(2);//设置数的小数部分所允许的最小位数(如果不足后面补0) 
        percent.setMaximumFractionDigits(3);//设置数的小数部分所允许的最大位数(如果超过会四舍五入) 
        str = percent.format(format);//1,234,317,160.00%
        System.out.println(str);
    }
        /**
     * 保留小数
     */
    @Test
    public void test5() {
        BigDecimal num1 = new BigDecimal("6.6468");
        BigDecimal num2 = new BigDecimal("-6.6468");
        // 四舍五入
        System.out.println(num1.setScale(2, BigDecimal.ROUND_HALF_UP)); // 6.65
        System.out.println(num2.setScale(2, BigDecimal.ROUND_HALF_UP)); // -6.65

        System.out.println("-----------");
        System.out.println(num1.setScale(2, BigDecimal.ROUND_DOWN)); // 6.64
        System.out.println(num2.setScale(2, BigDecimal.ROUND_DOWN)); // -6.64

        System.out.println("-----------");
        System.out.println(num1.setScale(2, BigDecimal.ROUND_FLOOR)); // 6.64
        System.out.println(num2.setScale(2, BigDecimal.ROUND_FLOOR)); // -6.65

        System.out.println("-----------");
        System.out.println(num1.setScale(2, BigDecimal.ROUND_FLOOR)); // 6.64
        System.out.println(num2.setScale(2, BigDecimal.ROUND_FLOOR)); // -6.65

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值