我想把从 1 到 1000000 的所有数字相加。
range = 1..1000000
println range.each { it * it }.sum()
结果我得到了1784293664而不是500000500000。我假设,我需要一个BigInteger。但是当我尝试时
range = 1..1000000
println range.each { it * it }.sum().toBigInteger()
什么都没有改变。
我的错误在哪里?
您已经完成了具有相同(截断)错误的求和,然后将该错误答案转换为BigInteger
。在转换之前是错误的。是什么让你认为BigInteger
能够神奇地恢复失去的精度?:-)
您的范围为 IntRange
类型。这是一个正确的:
range = 1G..1000000G
println range.each { it * it }.sum()
您可以使用 G 后缀创建 BigInteger 文字:例如 1G..1000000G
. 不需要each
表达式。
(1G..1000000G).sum()
你想把这些数字的平方相加吗? 如果是这样,您应该调用collect
而不是each
。 当你用 each
遍历范围时,你正在计算的表达式 (it * it
) 将被丢弃。 在这种情况下,它看起来像:
(1G..1000000G).collect { it * it }.sum()
请注意,collect
强制急切地计算范围,并在内存中创建大型集合。 您可能需要考虑使用 inject
以增量方式计算它:
(1G..1000000G).inject(0, { sum, value -> sum + value * value } )