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。

展开阅读全文

没有更多推荐了,返回首页