请考虑以下代码段 -
def factorial(number) {
if(number == 1)
return number;
else
return number * factorial(number - 1);
}
println factorial(50)
println factorial(50).getClass()
println()
println 45**20
println ((45**20).getClass())
输出是 -
0
class java.lang.Integer
1159445329576199417209625244140625
class java.math.BigInteger
问题 -
number * factorial(number-1)
的结果提升为BigInt
?答案 0 :(得分:1)
旧问题,但我会尝试回答问题的两个部分:
Groovy documentation on arithmetic operations表示
涉及
java.lang.Number
子类的二进制操作会根据以下矩阵自动转换它们的参数(除了除法,这将在下面讨论)
我不会粘贴矩阵,但它不会向BigInteger
或BigDecimal
指定任何转换,除非其中一个运算符属于这些类型之一。
在分割的情况下:
如果操作数是Float或Double,则除法运算符“/”和“/ =”产生Double结果,否则产生BigDecimal结果
我认为该表未考虑幂运算符(**
),因为它不存在于Java中,并且如@tim_yates注释中所述,power
实现默认使用BigInteger
。
code in DefaultGroovyMethods.java
清楚地表明int
的力量是使用BigInteger
来计算的,如果结果很小则会再次转换为int(这就是为什么{ {1}}是(2**4).class
):
java.lang.Integer
要确认其他操作的行为,您可以转到IntegerMath
,LongMath
或org.codehaus.groovy.runtime.typehandling package
答案 1 :(得分:0)
使用Groovy,Integer.multiply( Integer )
总是返回一个整数。
阶乘方法在第16步开始溢出。
在步骤34,您最终得到-2147483648 * -2147483648
,返回0,因此结果将始终为0
一种解决方法是将方法声明更改为:
def factorial( BigInteger number ) {