我想将 1 到 1000000 的所有数字相加。
range = 1..1000000
println range.each { it * it }.sum()
结果,我得到 1784293664 而不是 500000500000。我假设,我需要一个 BigInteger。但是当我尝试
range = 1..1000000
println range.each { it * it }.sum().toBigInteger()
没有什么变化。
我的错误在哪里?
我想将 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能够神奇地恢复丢失的精度?:-)
您可以使用 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 } )
你的范围是 type IntRange。这是一个正确的:
range = 1G..1000000G
println range.each { it * it }.sum()