天天看點

java BigDecimal的用法簡介

在Java中,float聲明的變量是單精度浮點數,double聲明的變量是雙精度浮點數,顧名思義就是double型的實體占用記憶體空間是float的兩倍。float是4個位元組而double是8個位元組。float和double類型的資料,無法精确表示計算結果,這是由于float和double是不精确的計算。大家可以通過下面代碼可以看出來:

public class Test
{
    public static void main(String[] args)
    {
    System.out.println( + );
    System.out.println( - );
    System.out.println( * );
    System.out.println( / );
    }
}
           

運作的結果為:

0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999
           

要想獲得理想的結果,我們可以考慮使用BigDecimal來獲得更精确的計算:

BigDecimal提供了多個構造函數,和浮點數有關的有:

BigDecimal(double val)  Translates a double into a BigDecimal.
BigDecimal(String val) Translates the String repre sentation of a BigDecimal into a BigDecimal.
           

但是用double參數來建立對象得到不精确的值,隻有通過String來建立對象才是最準确的。

例如:

BigDecimal data1=new BigDecimal();
System.out.println(data1.toString());
BigDecimal data2=new BigDecimal("0.05");
System.out.println(data2.toString());
           

得到結果:

0.05000000000000000277555756156289135105907917022705078125
0.05
           

是以,我們最終需要使用String來建立對象,這樣得到的結果才是最精确的。另外,如果是double數,我們還可以使用:BigDecimal.valueOf(double val),原因很簡單,其JDK源碼如下所示:

public static BigDecimal valueOf(double val)
{
    return new BigDecimal(Double.toString(val));
}
           

最後需要說明的是:BigDecimal的加減乘除其實最終都傳回的是一個新的BigDecimal對象,因為BigDecimal是不可變的(immutable)的,在進行每一步運算時,都會産生一個新的對象,是以a.add(b);雖然做了加法操作,但是a并沒有儲存加操作後的值,正确的用法應該是a=a.add(b)。

轉載自:BigDecimal的用法簡介