Scala计算1到100累乘第17次输出结果为负数的原因是什么
问题原因
你遇到的是整数溢出问题:
- Scala中默认的
Int类型是32位有符号整数,取值范围是-2^31到2^31-1,也就是-2147483648到2147483647。 - 你定义的
num没有显式指定类型,Scala会自动推导为Int类型。 - 计算到16的阶乘时结果就已经达到
20922789888000,远大于Int的最大取值,溢出后二进制最高位(符号位)被置为1,所以第17次打印时结果就变成了负数。
修复方案
更换num的整数类型即可解决:
- 如果仅需要计算到20的阶乘,可以替换为64位有符号整数
Long,最大支持到9223372036854775807 - 如果要完整计算1到100的累乘,需要使用支持任意精度的
BigInt类型
修复后代码示例
object Accumulate { def main(args: Array[String]): Unit = { var num = BigInt(1) for (a <- 1 to 100) { num = a * num println("Result:" + num + ", Time:" + a) } } }
内容的提问来源于stack exchange,提问作者user17342260
相关产品推荐
相关产品推荐

