1/3を3回追加すると、1に近い数値が期待されますが、正確に1.0になります。
実際、プログラミングの経験に汚染されていない普通の人は、n * 1 / nが1に等しいと期待しますが、ここでは普通ではありません。
私はあなたの問題を正確に再現することはできません、私は得ます
groovy:000> def foo(n) {
groovy:001> sum = 0.0
groovy:002> for (int i = 0; i < n; i++) {
groovy:003> sum += 1.0 / n
groovy:004> }
groovy:005> sum
groovy:006> }
===> true
groovy:000> foo(3)
===> 0.9999999999
ここには2つの問題があるかもしれませんが、少なくともそれらに注意する必要があります。
1つは、doubleは正確ではなく、一部の値を正確に表すことができないことです。また、少しずれていることを期待する必要があります。目標は100%の精度ではなく、エラーを許容範囲内に保つことです。(Peter Lawreyが、ダブルスに関する興味深い記事をチェックしておくとよいでしょう。)それがうまくいかない場合は、ダブルスを避けたいと思うでしょう。多くの用途では、BigDecimalで十分です。質問の分割の問題が正確な答えを与えるライブラリが必要な場合は、この質問の答えを確認してください。
もう1つの問題は、System.out.printlnがdoubleの正確な値を教えてくれないことです。これは、少し曖昧です。次のような行を追加した場合:
System.out.println(new java.math.BigDecimal(sum));
次に、ダブルに含まれるものの正確なビューを取得します。