1. 程式人生 > >BigDecimal類和以BigDecimal類為基礎定義類Arith工具類

BigDecimal類和以BigDecimal類為基礎定義類Arith工具類

一、認識

float和double兩種資料型別容易引起精度的丟失,所以java提供BigDecimal類提高精度。該類提供了大量的構造器用於 建立BigDecimal 物件,把所有的基本數值型別變數轉換成一個BigDecimal物件。

二、常用的兩個構造器:

1、BigDecimal(double value):不推薦使用該構造器,因為當使用new BigDecimal(0.1)來建立一個物件時,它的值不是0.1,而實際上是一個近似0.1的值,表面看著是個0.1。

2、BidDiecimal(String value):推薦使用這個構造器,newBigDecimal("0.1")來建立一個物件時,得到的和預期的一樣是個0.1的值。

注意如果非要接收一個double的值得話,可以通過BigDecimal.valueOf(double value)靜態方法來建立物件。例如:

BigDecimal f2 = BigDecimal.valueOf(0.01);

三、基本操作

add(BigDecimal value):精確加法

subtract(BigDecimal value):精確減法

multiply(BigDecimal value):精確乘法

divide(BigDecimal value);精確除法

四、java實現

import java.math.BigDecimal;

public class BigDecimalTest {
    public static void main(String[] args){
        BigDecimal f1 = new BigDecimal("0.05");
        BigDecimal f2 = BigDecimal.valueOf(0.01);
        BigDecimal f3 = new BigDecimal(0.05);
        System.out.println(f1);
        System.out.println("使用String作為BigDecimal構造器引數");
        System.out.println(f2);
        System.out.println("0.05 + 0.01 = " + f1.add(f2));
        System.out.println("0.05 - 0.01=" + f1.subtract(f2));
        System.out.println("0.05 * 0.01=" + f1.multiply(f2));
        System.out.println("0.05 / 0.01=" + f1.divide(f2));
        System.out.println("使用double作為BigDecimal構造器引數:");
        System.out.println("0.05 + 0.01 =" + f3.add(f2));
        System.out.println("0.05 - 0.01 =" + f3.subtract(f2));
        System.out.println("0.05 * 0.01 =" + f3.multiply(f2));
        System.out.println("0.05 / 0.01 =" + f3.divide(f2));
    }
}

結果:

五、Arith工具類

過程:先將double數值包裝成BigDecimal型別,運算出結果後,再轉成double型別。

java實現:

import java.math.BigDecimal;

public class Arith {
    //預設除法運算精度
    private static final int DEF_DIV_SCALE = 10;
    //構造器私有,讓這個類不能例項化
    private Arith(){}
    //提供精確的加法運算
    public static double add(double v1,double v2){
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.add(b2).doubleValue();
    }
    //提供精確的減法運算
    public static double sub(double v1,double v2){
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.subtract(b2).doubleValue();
    }
    //提供精確的乘法運算
    public static double mul(double v1,double v2){
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.multiply(b2).doubleValue();
    }
    //提供精確的除法運算
    public static double div(double v1,double v2){
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.divide(b2).doubleValue();
    }
}

//ArithMain類

public class ArithMain {
    public static void main(String[] args){
        System.out.println("0.06 + 0.02 = " + Arith.add(0.06,0.02));
        System.out.println("0.06 - 0.02 = " + Arith.sub(0.06,0.02));
        System.out.println("0.06 * 0.02 = " + Arith.mul(0.06,0.02));
        System.out.println("-123.3 / 100 = " + Arith.div(-123.3,100));

    }
}

結果: