Groovy Tip 30 BigDecimal資料型別
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。
相關文章
- BigDecimal轉為String型別、int型別Decimal型別
- js資料型別之基本資料型別和引用資料型別JS資料型別
- 資料型別: 資料型別有哪些?資料型別
- 強資料型別和弱資料型別資料型別
- 區別值型別資料和引用型別資料型別
- 資料型別,型別轉換資料型別
- 資料型別資料型別
- JSON序列化時將BigDecimal型別轉換成String型別JSONDecimal型別
- UFDoble型別計算、比較大小。BigDecimal轉UFDouble型別Decimal
- 3. php資料型別、資料型別轉換PHP資料型別
- JAVA中基本資料型別和引用資料型別Java資料型別
- 基本資料型別與字串型別資料型別字串
- Java中的基本資料型別與引用資料型別Java資料型別
- MySQL基礎之----資料型別篇(常用資料型別)MySql資料型別
- Mysql資料庫學習(二):資料型別(數值型別 日期和時間型別 字串型別)MySql資料庫資料型別字串
- 包裝類型別,跳脫字元,BigDecimal,BigInteger,Ca型別字元Decimal
- php資料型別PHP資料型別
- Symbol資料型別Symbol資料型別
- JavaScript - 資料型別JavaScript資料型別
- 資料型別2資料型別
- JavaScript 資料型別JavaScript資料型別
- js資料型別JS資料型別
- 1.2 資料型別資料型別
- 一、資料型別資料型別
- JavaScript資料型別JavaScript資料型別
- numpy資料型別資料型別
- Sqlite—資料型別SQLite資料型別
- NumPy 資料型別資料型別
- MYSQL 資料型別MySQL 資料型別
- Redis資料型別Redis資料型別
- protobuf資料型別資料型別
- mxArray資料型別資料型別
- Interval資料型別資料型別
- Oracle資料型別Oracle資料型別
- JavaScript: 資料型別JavaScript資料型別
- 基本資料型別資料型別
- WINDOWS資料型別Windows資料型別
- SQL 資料型別SQL資料型別