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

为什么Groovy以这种方式执行浮点运算?

发布时间:2020-12-14 16:24:37 所属栏目:大数据 来源:网络整理
导读:在Groovy中尝试浮点运算.不知道为什么/如何/什么groovy在幕后做这些不同类型的行为? double point2 = 0.2double point1 = 0.1double point3 = 0.3assert point2 + point1 == point3 // false,as expected | | | | | 0.2 | 0.1 | 0.3 | false 0.300000000000
在Groovy中尝试浮点运算.不知道为什么/如何/什么groovy在幕后做这些不同类型的行为?

double point2 = 0.2
double point1 = 0.1
double point3 = 0.3

assert point2 + point1 == point3 // false,as expected
   |      | |      |  |
   0.2    | 0.1    |  0.3
          |        false
          0.30000000000000004    

float point2 = 0.2
float point1 = 0.1
float point3 = 0.3

assert point2 + point1 == point3 // false,as expected
   |      | |      |  |
   0.2    | 0.1    |  0.3
          |        false
          0.30000000447034836

def point2 = 0.2
def point1 = 0.1
def point3 = 0.3

assert point2 + point1 == point3 // this returns true  
assert 0.2 + 0.1 == 0.3 // this returns true

我认为它与BigDecimal有关,但后来我尝试了这个.

BigDecimal point2 = 0.2
BigDecimal point1 = 0.1
BigDecimal point3 = 0.3

float point4 = 0.4

assert point1 + point3 == point4
   |      | |      |  |
   0.1    | 0.3    |  0.4
          0.4      false

是什么导致了这种行为?

解决方法

你的def:s有BigDecimals

groovy:000> p1 = 0.1
===> 0.1
groovy:000> p1.getClass()
===> class java.math.BigDecimal

并且equals无法在BigDecimal和本机float / double之间进行比较

groovy:000> p1.equals(0.1f)
===> false
groovy:000> p1.equals(0.1)
===> true
groovy:000> p1==0.1f
===> false
groovy:000> p1==0.1
===> true

还不确定,为什么==适用于[Dd] ouble.

groovy:000> p1.equals(0.1d)
===> false
groovy:000> p1==0.1d
===> true

我的猜测是,它隐藏在DefaultTypeTransformation.compareToWithEqualityCheck中.由于双方都是数字:s.

(编辑:李大同)

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

    推荐文章
      热点阅读