1

1から1000000までのすべての数値を合計したいと思います。

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

その結果、500000500000ではなく1784293664を取得します。BigIntegerが必要だと思います。でもやってみると

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

何も変わりません。

私の間違いはどこにありますか?

4

3 に答える 3

4

同じ(切り捨てられた)エラーがある合計を実行し、その誤った答えをに変換しましたBigInteger。それが変換される前にそれは間違っていました。BigInteger失われた精度を魔法のように回復できると思う理由は何ですか?:-)

于 2013-01-25T20:41:47.453 に答える
2

あなたの範囲はタイプIntRangeです。正しいものは次のとおりです。

range = 1G..1000000G
println range.each { it * it }.sum()
于 2013-01-25T20:48:12.157 に答える
2

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 } )
于 2013-01-25T22:12:45.053 に答える