2

重複の可能性:
Java の浮動小数点数と倍精度数、0.0 + 0.1 + … + 0.1 == 0.9000001 を回避するには?

Java で次の問題が発生しています。0.1f と 1.0f の間を 0.1f ずつ繰り返す必要があるため、出力を次のようにしたいと考えています。

    0.1
    0.2
    0.3
    0.4
    ...
    0.9

代わりに、私がするとき:

for(float i = 0.1f; i < 1f; i += 0.1f)
    System.out.println(i);

私は得る

0.1
0.2
0.3
0.4
0.5
0.6
0.70000005
0.8000001
0.9000001

分数がコンピューターによって表現される方法と関係があると思いますが、なぜそうなのかを知りたいのですが、それを止めるために私にできることがあれば. ありがとう。

4

4 に答える 4

6

for ループで整数を使用して、浮動小数点エラーを悪化させる浮動小数点演算の繰り返しを回避します。

for (int i = 1; i < 10; i++)
{
   float f = (float) i / 10.0f;
   System.err.println(f);
}
于 2012-12-04T23:01:05.663 に答える
2

これを試すことができます:

for(int i = 1; i < 10; i++)
    System.out.println(i/10f);
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9

あなたが見ているのは、フロートに固有の不正確さの産物であり、投稿したコードで行うように、フロートを継続的に追加すると自然に蓄積されます。代わりにループで sを使用するintと、浮動小数点加算が回避されるため、エラーの蓄積も回避されます。

于 2012-12-04T23:01:16.970 に答える
0

浮動小数点数は 2 進数であり、10 進数をうまく表現できません

該当する場合は、代わりに 1/8 または 0.125 で反復します。

于 2012-12-04T22:58:34.653 に答える
-2
for(float i =1.0f;i<10f;i+=1f)
System.out.println(i/10f);`

地獄のように醜いですが、ここで動作します(Ubuntu AMD64 OpenJDK)

于 2012-12-04T23:00:56.600 に答える