我想将 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()