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)
它似乎有效,但我们已经在 Java 中根深蒂固,不做这种事情。
+=呢?例如
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/