列表包含()在java/groovy中比较双精度

vwoqyblh  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(304)

所以我有一个表达: [8.42431001E10].contains(getSomeValue('000000084243100100')) getsomevalue(字符串值)将字符串转换为双精度。

public Object getSomeValue(String value) {
 if (NumberUtils.isNumber(value)) {
      try { 
        result = NumberUtils.createDouble(value);
      } catch (Exception e) {
        result = value;
      }
    } else {
      result = value;
    }
    return result;
}

也就是说 getSomeValue('000000084243100100') 返回8.42431001e10
然而,上面的表达 [8.42431001E10].contains(getSomeValue('000000084243100100')) 返回false,即使我希望它为true。
将所有内容转换为字符串(如此字符串)时: ["8.42431001E10"].contains(getSomeValue('000000084243100100').toString()) 返回true。
我想了解如何使其作为双精度值而不是字符串返回true。
我也尝试过这样做:

[8.42431001E10].contains(Double.valueOf(getSomeValue('000000084243100100')))

但仍然是错误的。
请帮忙。非常感谢。

kiayqfof

kiayqfof1#

groovy中的“数字文字”为您提供了 BigDecimal (而不是像许多其他(jvm-)语言中的float/double)。及 BigDecimal 是精确的,而双精度/浮点值不是(这是速度大于精度的近似值)。

def x = 8.42431001E1
println x.getClass()
// → class java.math.BigDecimal
println(x==Double.valueOf('000000084243100100'))
// → false

因此,您必须将一侧投影到同一类型,以使它们具有可比性。
既然两个数字实际上都没有分数,这就引出了一个问题,为什么不使用呢 BigInteger 不管怎样,首先对双方都是如此。

相关问题