Groovy 造型和数字运算符

当使用一个数字运算符的时候明白到底发生了什么是十分重要的。 在groovy中,加、乘和减法运算的大多数规则与java一样,但是关于浮点数的行为有点不一样,BigInteger和BigDecimal也需要包含进来,规则是易懂的,先符合的规则总是被使用。

对于+、-、*运算来说:

 如果有一个数为Float或者Double,那么结果是Double(在java中,只有操作数都是Float的时候,结果也是Float)。

 否则,如果一个操作数为BigDecimal,结果为BigDecimal。

 否则,如果一个操作数为BigInteger,结果为BigInteger。

 否则,如果一个操作数为Long,那么结果为Long。

 否则,结果为一个Integer。

表3.9显示了一个查询表,类型用缩写的大写字母表示。 表3.9 数字转换

另一方面的行为:

 像java,不像Ruby,当运算结果超出类型表示的范围的时候,不会进行类型提升,幂运算除外。

 对于除法运算,如果任何一个数是Float(或者Double)类型,那么运算结果为Double类型;否则,结果为BigDecimal类型,精度与两个数的精度值较大的为准,采用四舍五入的方式,结果是规范化的——小数位后面没有无效的0。

 整数除法(结果保留为整数)通过显示造型或者使用intdiv方法是可以完成的。

 移位运算符仅仅运用于Integer和Long,它们不能转换为别的类型。

 幂运算的结果会自动提升到能够容纳结果的范围和精度的类型,提升顺序为 Integer,Long,Double。

 比较运算符在比较之前提升到较大范围的类型。

没有例子,规则是难以理解的,表3.10用例子来说明这些行为。

唯一的意外就是没有意外,在java中,像第四行的结果总是出乎意外的,例如,(1/2)结果总是0,因为进行除法运算的两个操作数都是整数,仅仅是执行了整数除法,在java中为了得到0.5的结果,需要将代码写成(1f/2)。

在增强用户自定义输入行为的groovy程序中,这种行为尤其重要,假如允许应用程序的超级用户指定一个规则来计算职员的奖金,并且规则是businessDone*(1/3),在java语义中,这对可怜的职员来说将是糟糕的一年。