加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Groovy Tip 30 BigDecimal数据类型

发布时间:2020-12-14 16:55:46 所属栏目:大数据 来源:网络整理
导读:??????????????? Groovy Tip 30 BigDecimal数据类型 ? ? Groovy语言比Java语言使用起来更为方便的一个地方就是Groovy语言引入了对大小数的运算。当然,我们这里所说的大小数,是指精度超过float类型和double类型的小数。我们可能在某些场合会涉及到对大小数

??????????????? 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。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读