9

重複の可能性:
Javaで0.1f刻みで0.1fと1.0fの間で反復する方法は?

私のプログラムの一部は、whileループ内の値を次のように使用する必要があります。

0.1

0.2

0.3

..。

0.9

そのため、そのループ内にそれらを提供する必要があります。コードは次のとおりです。

double x = 0.0;
while ( x<=1 )
{
// increment x by 0.1 for each iteration
x += 0.1;
}

出力を正確にする必要があります:

0.1

0.2

0.3

0.4

0.5

0.6 0.6

0.7

0.8

0.9

しかし、実際には次のようなものが得られます。

0.1

0.2

0.300000000000000000000000004

0.4

0.5

0.6 0.6

0.79999999999999999999999999

0.89999999999999999999999999

0.99999999999999999999999999

4

6 に答える 6

13

0.1が0.1ではない浮動小数点の世界へようこそ。問題は、0.1を含む多くの数値を、で正確に表すことができないことdoubleです。xしたがって、ループを通過するたびに正確に0.1を追加しているわけではありません。

1つのアプローチは、整数演算を使用して10で除算することです。

int i = 0;
while (i <= 10) {
    double x = i / 10.0;
    . . .
    i++;
}

もう1つのアプローチは、を作成xするBigDecimalことです。ここで、特定の精度が必要であることを指定できます。基本的には上記のループ(整数とスケール)を実行しますが、ベルとホイッスルがたくさんある素敵なクラスにパッケージ化されています。ああ、それは任意の精度を持っています。

于 2012-12-12T04:40:55.383 に答える
2

期待される出力を得るには、10進フォーマッターを使用する必要があります。

以下は、期待される出力を生成するためのコードです。

import java.text.DecimalFormat;


public class FloatIncrement {

    public static void main (String args[]){

        double x= 0.0;
        DecimalFormat form = new DecimalFormat("#.#");      
        while(x<0.9){
            x= x+0.1;
            System.out.println("X : "+Double.valueOf(form.format(x)));          

        }

    }
}
于 2012-12-12T05:05:22.937 に答える
1

必要な出力を取得するには、を使用できますDecimalFormat。ここにいくつかのサンプルコードがあります。

import java.text.DecimalFormat;

public class DF {

  public static void main(String [] args) {

    double x = 0.1;
    DecimalFormat form = new DecimalFormat("#.#");
    while (x <= .9) {
      System.out.println(Double.valueOf(form.format(x)));
      x += 0.1;
    }

  }

}

現在の実装に関しては、浮動小数点数の性質により、印刷されるものの精度について保証はありません。

于 2012-12-12T04:48:51.453 に答える
1

BigDecimalの使用

double x = 0.0;
   int decimalPlaces = 2;           

  while ( x<=1 )
  {

    x += 0.1;
    BigDecimal bd = new BigDecimal(x);
    bd = bd.setScale(decimalPlaces, BigDecimal.ROUND_HALF_UP);
    x = bd.doubleValue();           

    System.out.println(x); 
  }
于 2012-12-12T04:40:22.733 に答える
0

これは、FPがすべての10進値を正確に表すことができないため、2進浮動小数点を使用して正確な10進演算を実行できるためです。

100分の1や1000分の1のような小数の小数単位を表す整数値を使用するか、BigDecimalのようなものを使用する必要があります。

于 2012-12-12T04:42:06.370 に答える
0

Doubleはバイナリで格納されます

有効数字の特定の数と小数点(科学的記数法のようなもの)として、浮動小数点数と倍精度浮動小数点数を格納します。有効数字の部分は、特定の数の2進数として格納されるため、常に完全であるとは限りません。したがって、期待どおりのパフォーマンスを期待することはできません。(より良い説明については、http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.htmlを参照してください

BigDecimalなどのクラス、またはここで説明したような有理数を実装するクラスの使用を検討してください-Javaで一般的に使用される有理数ライブラリはありますか?

また、iを整数に変換し、1から10に変更して、コードでこれを補正することもできます。

于 2012-12-12T04:43:24.703 に答える