groovy - 在 groovy/grails 中的 BigDecimal 上使用比较运算符是否安全?

标签 groovy comparison operator-keyword bigdecimal

Java 比较两个 BigDecimal 的方法是使用 compareTo() 方法,并检查结果是 -1、0 还是 1。

BigDecimal a = new BigDecimal("1.23")
BigDecimal b = new BigDecimal("3.45")
if (a.compareTo(b) > 0)) { }

我看到有些人在 grails 中使用这种格式:
 if (a > b) {  }

这是否正常工作? IE。它会得到正确的小数,还是转换为浮点数或类似的并进行比较?

使用 "=="与使用 equals() 怎么样?

像这样的结果是什么:
BigDecimal a = new BigDecimal("1.00")
BigDecimal b = new BigDecimal("1")
assert (a==b)

它似乎有效,但我们已经在 J​​ava 中根深蒂固,不做这种事情。

+=呢?例如
a+=b?

这是否与
a = a.add(b)

哪里能找到这种东西?我有两本 groovy 的书,不幸的是都没有提到 BigDecimal 比较或算术,只有转换/声明。

最佳答案

Groovy 允许运算符重载。当类型实现某些方法时,您可以在该类型上使用相应的运算符。

对于 +实现的方法是加号,不是加号。

对于大于或小于比较,Groovy 在对象上查找 compareTo 方法,并查找 ==它寻找一个名为 equals 的方法。 (如果你想比较引用,就像在 Java 中使用 == 一样,你必须使用 is 。)

这是一个常见数学运算符表以及用于重载它们的方法:

Operator     Method
a + b        a.plus(b)
a - b        a.minus(b)
a * b        a.multiply(b)
a / b        a.divide(b)
a++ or ++a   a.next()
a-- or --a   a.previous()
a << b       a.leftShift(b)

您可以看到 BigDecimal 重载了其中的一些方法(您可以重载加号、减号、乘法和除法,但不会重载 next、previous 或 leftShift):
groovy:000> BigDecimal.methods*.name
===> [equals, hashCode, toString, intValue, longValue, floatValue, doubleValue,
byteValue, shortValue, add, add, subtract, subtract, multiply, multiply, divide,
 divide, divide, divide, divide, divide, remainder, remainder, divideAndRemainde
r, divideAndRemainder, divideToIntegralValue, divideToIntegralValue, abs, abs, m
ax, min, negate, negate, plus, plus, byteValueExact, shortValueExact, intValueEx
act, longValueExact, toBigIntegerExact, toBigInteger, compareTo, precision, scal
e, signum, ulp, unscaledValue, pow, pow, movePointLeft, movePointRight, scaleByP
owerOfTen, setScale, setScale, setScale, stripTrailingZeros, toEngineeringString
, toPlainString, round, compareTo, getClass, notify, notifyAll, wait, wait, wait
, valueOf, valueOf, valueOf]

你得到 == , > , < , >= , 和 <=基于您的对象如何实现 equals 和 compareTo。

因此,运算符导致已在 BigDecimal 中声明的方法或通过 groovy 添加到 BigDecimal 的方法被调用。它绝对不会对像 float 这样的原始类型进行任何类型的转换,以便能够在原始类型上使用运算符。

该表取自 this developerworks article by Andrew Glover and Scott Davis ,其中包含更多详细信息并包含示例代码。

关于groovy - 在 groovy/grails 中的 BigDecimal 上使用比较运算符是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30100856/

相关文章:

performance - 哪种素数生成算法最快?

sql - 具有不同列数的记录类型比较不会失败

matlab - 如何在 Matlab 中正确重载 size() 方法/运算符

Java + 运算符行为未按预期继承

sql-server - T-SQL IS NOT NULL 与 NOT NULL 性能

c++ - 如何创建和使用类箭头运算符?

groovy - 如何在groovy中检索嵌套属性

groovy - 不正确的 getter 的 groovy 问题

java - 从命令行绑定(bind)变量来测试 groovy 脚本

grails - Grails 最佳实践资源