2

このコードを実行していましたが、ループが指定された条件で停止していないようです。

for(double i=1.0; i!=2.0; i+=0.2){
    System.out.println("The value of i :" +i);
}

これは、Javaでのdouble数の表現方法に問題がありますか?

4

2 に答える 2

7

これはかなり一般的な問題です。正確にaで0.2表すことはできないため、10を足した合計とは等しくありません。ループを停止する代わりにを使用する必要があります。double2.00.2<!=

ループは2の負の累乗に等しい増分で機能することに注意してください。たとえば、0.25以下のループは正常に機能し、期待どおりに停止します。

for(double i=1.0; i!=2.0; i+=0.25){
    System.out.println("The value of i :" +i);
}

0.25で正確に表すことができるため、これは機能しdoubleます。doubleこの小さな実験は、 sの等式または不等式を比較するときに非常に注意する必要があることを示しています。

于 2013-03-07T14:17:07.650 に答える
2

はい、それだけです-0.2をdoubleとして正確に表すことはできません。正確な値を確認するには、次のプログラムを実行できます。

public static void main(String[] args) {
    for (double i = 1.0; i != 2.0 && i < 3.0; i += 0.2) {
        System.out.println("The value of i :" + new BigDecimal(i));
    }
}

印刷するもの:

The value of i :1
The value of i :1.1999999999999999555910790149937383830547332763671875
The value of i :1.399999999999999911182158029987476766109466552734375
The value of i :1.5999999999999998667732370449812151491641998291015625
The value of i :1.79999999999999982236431605997495353221893310546875
The value of i :1.9999999999999997779553950749686919152736663818359375
The value of i :2.199999999999999733546474089962430298328399658203125
The value of i :2.399999999999999911182158029987476766109466552734375
The value of i :2.600000000000000088817841970012523233890533447265625
The value of i :2.800000000000000266453525910037569701671600341796875

あなたのオプション:

  • 数値を丸める
  • 条件を使用しi < 2.0ます(ただし、丸めによっては1回の反復を見逃す可能性があります)
  • BigDecimal0.2の正確な表現にはaを使用します
于 2013-03-07T14:18:00.363 に答える