精確計算_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

    }
}
發佈了86 篇原創文章 · 獲贊 83 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章