为什么更高范围的产品答案会导致kotlin为0?

时间:2018-03-30 03:56:25

标签: kotlin

为什么(1..100)会减少产品的工作量?

>>> (1..100).toList().reduce { acc, i -> acc * i }
0
>>> (1..10).toList().reduce { acc, i -> acc * i }
3628800

由于

2 个答案:

答案 0 :(得分:5)

基本上价值溢出。当你使用longs时也非常清楚:

fun main(args: Array<String>) {
    println("Max int: " + Int.MAX_VALUE)
    println("1..12 int: " + (1..12).toList().reduce { acc, i -> acc * i })
    println("1..12 long: " + (1L..12L).toList().reduce { acc, i -> acc * i })
    println("---")
    println("Max long: " + Long.MAX_VALUE)
    println("1..13 int: "  + (1..13).toList().reduce { acc, i -> acc * i })
    println("1..13 long: "  + (1L..13L).toList().reduce { acc, i -> acc * i })
}

输出:

Max int: 2147483647
1..12 int: 479001600
1..12 long: 479001600
---
Max long: 9223372036854775807
1..13 int: 1932053504
1..13 long: 6227020800

最多12个,乘法的结果值总是小于Int.MAX_VALUE,如上所示,使用整数和长整数返回的结果是相同的。

从13日起,OTOH,结果发生了变化。使用int时,值溢出,结果开始出错。 long仍然可以使用(而且,正如您所看到的,返回的值大于Int.MAX_VALUE

答案 1 :(得分:0)

最简单的答案是该值高于限制。