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。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |