BigDecimal的簡單學習

package com.hanchao.test;
import java.math.BigDecimal;
/***********************
 * BigDecimal的簡單學習測試
 * @author:han   
 * @version:1.0       
 * @created:2013-11-11   
 ***********************
 */
public class TestBigDecmal {
      
    /**
        一提到Java裏面的商業計算,咱們都知道不能用float和double,由於他們沒法進行精確計算。
        可是Java的設計者給編程人員提供了一個頗有用的類BigDecimal,
        他能夠完善float和double類沒法進行精確計算的缺憾。
     */
      
    /**
     * ava.math.BigDecimal。BigDecimal一共有4個夠造方法,讓我先來看看其中的兩種用法:
        第一種:BigDecimal(double val)
        Translates a double into a BigDecimal.
          
        第二種:BigDecimal(String val)
        Translates the String repre sentation of a BigDecimal into a BigDecimal.
          
          
          
        不少人會問到怎麼將基本類型,如int,float,double,long,和BigDecimal對象相互轉換。很簡單:
        基本類型經過構造函數轉換成對應的BigDecimal對象,
        而BigDecimal類提供了諸如intValue(), floatValue(),
         doubleValue(), longValue()方法來將BigDecimal對象轉換成對應的值。
     */
    public static void main(String[] args) {
          
        BigDecimal b1 = new BigDecimal("9.111");
        System.out.println(" b1: " + b1);   // b1: 9.111
        System.out.println(" b1: 變形:" + b1.intValue());// b1: 變形:9
          
        BigDecimal b2 = new BigDecimal(9.111d);
        System.out.println(" b2: " + b2); // b2: 9.111000000000000653699316899292171001434326171875
        System.out.println(" b2: 變形:" + b2.doubleValue()); // b2: 變形:9.111
          
          
        BigDecimal b3 = new BigDecimal(9);
        System.out.println(" b3: " + b3); // b3: 9
        System.out.println(" b3: 變形:" + b3.intValue());// b3: 變形:9
          
        BigDecimal b4 = new BigDecimal(9.111f);
        System.out.println(" b4: " + b4);// b4: 9.11100006103515625
        System.out.println(" b4: 變形:" + b4.floatValue()); // b4: 變形:9.111
          
        BigDecimal b5 = new BigDecimal(900L);
        System.out.println(" b5: " + b5); // b5: 900
        System.out.println(" b5: 變形:" + b5.longValue());// b5: 變形:900
          
          
          
        /**
         * 1.精確加法運算
         */
        double r1 = add(1.1, 2.9912);
        System.out.println(" r1 : " + r1); //  r1 : 4.0912
          
        double r2 = 1.1 + 2.9912;
        System.out.println(" r2 : " + r2); // r2 : 4.091200000000001
          
        /**
         * 2.精確減法運算
         */
        double r3 = sub(2.002, 0.112);
        System.out.println(" r3: " + r3); // r3: 1.89
          
        double r4 = 2.002 - 0.112;
        System.out.println(" r4: " + r4);// r4: 1.8899999999999997
          
          
        /**
         * 3.精確乘法運算
         */
        double r5 = mul(2.002, 1.001);
        System.out.println(" r5: " + r5);// r5: 2.004002
          
        double r6 = 2.002 * 1.001;
        System.out.println(" r6: " + r6);// r6: 2.0040019999999994
          
        /**
         * 4.提供相對精確的除法運算
         */
        double r7 = div(3.4, 0.055, 2);
        System.out.println(" r7: " + r7); // r7: 61.82
          
        double r8 = 3.4 / 0.055;
        System.out.println(" r8: " + r8);// r8: 61.81818181818181
          
          
          
        /**
         * 5.四捨五入處理
         */
        double s1 = round(2.12512,3);
        System.out.println(" s1: " + s1);// s1: 2.125
          
        double s2 = round(2.12512, 2);
        System.out.println(" s2: " + s2);// s2: 2.13
          
          
          
    }
    /**
     * 提供精確的加法運算
     * *******************
     * @author: han
     * 2013-11-11
     * *******************
     * @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));
        double result = b1.add(b2).doubleValue();
        return result;
    }
      
    /**
     * 提供精確的減法運算
     * *******************
     * @author: han
     * 2013-11-11
     * *******************
     * @param v1    被減數
     * @param v2    減數
     * @return      兩個參數的差
     */
    public static double sub(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2).doubleValue();
    }
      
    /**
     * 提供精確的乘法運算
     * *******************
     * @author: han
     * 2013-11-11
     * *******************
     * @param v1    被乘數
     * @param v2    乘數
     * @return      兩個參數的伺機
     */
    public static double mul(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2).doubleValue();
    }
      
    /**
     * 提供(相對)精確的除法運算,當發生除不盡的狀況時,由scale參數指定精度,之後的數字四捨五入
     * *******************
     * @author: han
     * 2013-11-11
     * *******************
     * @param v1    被除數
     * @param v2    除數
     * @param scale 表示要精確到小數點後幾位
     * @return  兩個參數的商
     */
    public static double div(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();
    }
      
      
    /**
     * 提供精確的小數四捨五入處理
     * *******************
     * @author: han
     * 2013-11-11
     * *******************
     * @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();
    }
      
      
}
    	/**
    	 * 比較大小
    	 * 兩個BigDecimal值比較使用compareTo方法, 比較結果有-1, 0, 1, 
    	 分別表示小於, 等於, 大於; 對於0, 能夠使用BigDecimal.ZERO表示!
    	 */
    	BigDecimal num = new BigDecimal("-5");
    	BigDecimal num1 = new BigDecimal("-4");
    	if (num.compareTo(BigDecimal.ZERO) == -1) {
			System.out.println("num小於0");
		} else if (num.compareTo(BigDecimal.ZERO) == 1) {
			System.out.println("num大於0");
		} else if(num.compareTo(BigDecimal.ZERO) == 0) {
			System.out.println("num等於0");
		}
相關文章
相關標籤/搜索