Groovy中的大整数

Groovy中的大整数,groovy,integer,biginteger,Groovy,Integer,Biginteger,我想把从1到1000000的所有数字加起来 range = 1..1000000 println range.each { it * it }.sum() 结果我得到的是1784293664而不是500000500000。我想,我需要一个大整数。但是当我尝试的时候 range = 1..1000000 println range.each { it * it }.sum().toBigInteger() 没有什么变化 我的错误在哪里?您已经完成了具有相同截断错误的求和,然后将错误答案转换为一

我想把从1到1000000的所有数字加起来

range = 1..1000000
println range.each { it * it }.sum()
结果我得到的是1784293664而不是500000500000。我想,我需要一个大整数。但是当我尝试的时候

range = 1..1000000
println range.each { it * it }.sum().toBigInteger()
没有什么变化


我的错误在哪里?

您已经完成了具有相同截断错误的求和,然后将错误答案转换为一个大整数。在它被转换之前是错误的。是什么让你认为BigInteger能够神奇地恢复丢失的精度-

您已经完成了具有相同截断错误的求和,然后将错误答案转换为BigInteger。在它被转换之前是错误的。是什么让你认为BigInteger能够神奇地恢复丢失的精度-

您的范围是IntRange类型。这里有一个正确的答案:

range = 1G..1000000G
println range.each { it * it }.sum()
您的范围是IntRange类型。这里有一个正确的答案:

range = 1G..1000000G
println range.each { it * it }.sum()

您可以创建带有G后缀的BigInteger文本:例如1G..1000000G。没有必要对每个表达式都使用

(1G..1000000G).sum()
你想把这些数字的平方相加吗?如果是这样的话,你应该打对方付费电话而不是对方付费电话。当您使用each遍历该范围时,您正在计算它的表达式将被丢弃。在这种情况下,它看起来像:

(1G..1000000G).collect { it * it }.sum()
请注意,collect强制迫切地评估范围,并在内存中创建一个大型集合。您可能需要考虑使用增量来计算它:

(1G..1000000G).inject(0, { sum, value -> sum + value * value } )

您可以创建带有G后缀的BigInteger文本:例如1G..1000000G。没有必要对每个表达式都使用

(1G..1000000G).sum()
你想把这些数字的平方相加吗?如果是这样的话,你应该打对方付费电话而不是对方付费电话。当您使用each遍历该范围时,您正在计算它的表达式将被丢弃。在这种情况下,它看起来像:

(1G..1000000G).collect { it * it }.sum()
请注意,collect强制迫切地评估范围,并在内存中创建一个大型集合。您可能需要考虑使用增量来计算它:

(1G..1000000G).inject(0, { sum, value -> sum + value * value } )

那么你能给我一个建议,在哪里转换成BigInteger?我认为以BigInteger的形式做应该可以。事实上,既然你不想失去洞察力并且应该自动升级,{it as BigInteger*it}应该可以工作。因为一个意外的标记,它抛出了一个MultipleComplationErrorSexception…所以你能给我一个建议,在哪里转换为BigInteger?我认为作为BigInteger*它作为BigInteger应该可以。事实上,既然你不想失去知觉,应该自动升级,{it as BigInteger*it}应该能正常工作。因为意外的标记,它抛出了一个MultipleComplationErrorSexception…抱歉,但它没有帮助。这很有帮助,谢谢。事实上,即使范围=1..1000000L也有效。对不起,但没有帮助。这很有帮助,谢谢。事实上,即使范围=1..1000000L也有效。每个{it*it}部分都是冗余的,因为乘法的结果被丢弃。顺便说一句,从1到n的整数之和也可以表示为n+1*n/2,这将使计算机更容易:每个{it*it}部分都是冗余的,因为乘法的结果被丢弃。顺便说一句,从1到n的整数之和也可以表示为n+1*n/2,这将使计算机更容易: