Groovy Tip 30 BigDecimal資料型別

hivon發表於2009-03-30

                Groovy Tip 30 BigDecimal資料型別

 

 

Groovy語言比Java語言使用起來更為方便的一個地方就是Groovy語言引入了對大小數的運算。當然,我們這裡所說的大小數,是指精度超過float型別和double型別的小數。我們可能在某些場合會涉及到對大小數的處理,如果是使用Java語言,我們只能是或者使用java.math.BigDecimal來處理,當然,它的使用是很不方便的;或者乾脆自己設計資料型別來解決大小數的問題。但是,在Groovy語言中,我們卻能夠直接使用BigDecimal資料型別來解決這個問題。

 

在Groovy語言中,小數的預設型別就是BigDecimal型別。

 

      println 1.2.class.name

   

 

執行結果為:

java.math.BigDecimal

 

說到這裡,在做int型別除法運算時,有一個Groovy語言和Java語言的區別需要提出來。

在Java語言中,下面的運算:

 

       System.out.println(1/2);

   

 

的結果是0。

如果您想獲得小數,必須做如下的運算:

 

       System.out.println((float)1/2);

   

 

而在Groovy語言中,下面的運算:

 

      println (1/2)

 

 

的結果卻是0.5。

如果您想取整,必須做如下的運算:

 

      println ((1/2) as int)

 

 

在Groovy語言中,我們也可以使用負指數來表示大小數型別。如:

 

      println 1.2e-39

   

 

所以,我們初始化一個大小數可以使用小數的方式和負指數的方式。如:

     

      def bd1 = 1.23044953333333333

     

      def bd2 = 1.3e-45

     

      println bd1.class.name

     

      println bd2.class.name

 

 

執行結果為:

java.math.BigDecimal

java.math.BigDecimal

 

當然,我們還可以通過數值型字串來初始化一個大小數。如:

     

      def bd3 = '1.3e-40' as BigDecimal

     

      def bd4 = new BigDecimal('1.3e-40')

     

      println bd3.class.name

     

  println bd4.class.name

 

執行結果為:

java.math.BigDecimal

java.math.BigDecimal

 

說了這麼多,當然是時候該說說在Groovy語言中使用BigDecimal型別比在Java語言中使用BigDecimal型別更為方便的地方。當然了,我們所說的方便,首先體現在對BigDecimal型別資料的各種運算上,如加減乘除成方等等。如:

     

      println (1.2e-9+1.5e-9)

     

      println (1+1.2e-20)

 

 

執行結果為:

2.7E-9

1.000000000000000000012

 

 

      println 1e-4**3

 

 

執行結果為:

1.0000000000000002E-12

 

其次,在Groovy語言中有方便的負指數小數到小數型小數之間的轉化。如:

 

      println (1.2e-20.toPlainString())

 

 

執行結果為:

0.000000000000000000012

 

值得注意的是,如果想計算1和2之間的整除,上面的"(1/2) as int"方法固然是可取的。但實際上,這種計算有效能上的問題,它先是使用了BigDecimal型別之間的除法,然後又進行了一個型別轉換,這樣使得它在效能上很慢。

當然,Groovy語言為我們提供了直接的整除方法,如下面的程式碼:

 

      def result = 1.intdiv(2)

     

      println result

   

 

上面的結果為0。

相關文章