-1

次のコードを使用して、アクティビティの1つにスピナーを設定しています...

    for( double i = 0; i < 10 ; i+=0.1 ) {
        rVoltsList.add( Double.toString( i ) );
    }
    Spinner rVoltsSpinner = (Spinner) findViewById( R.id.recloseVoltsSpinner );
    ArrayAdapter<String> rVoltsAdapter = new ArrayAdapter<String>( this, android.R.layout.simple_spinner_item, rVoltsList );
    rVoltsSpinner.setAdapter( rVoltsAdapter );

これで、0.0、0.1、0.2、0.3、0.4などのリストが表示されると思いました。ただし、プログラムを実行すると、リストは次のようになります。

0.0
0.1
0.2
0.30000000000000000000000004
0.4
0.5
0.6
0.7
0.79999999999999999999
0.89999999999999999999
0.99999999999999999999
1.09999999999999999999
1.2
1.3
and this goes on until 9.99999999999999999998

何か案は?

4

2 に答える 2

5

これを使って:

rVoltsList.add( String.format("%.1f", i) );

問題は、それDouble.toString(i)が丸められないことです。

奇妙な値は、0.1(10進数)がJavaでの正確な表現を持たないdoubleため、ループ変数に追加するたびに、思ったものとは少し異なるものを追加しているためです(駄洒落を許します)。

double丸めの同じ問題は、ループ変数としてを使用してはならないことを示唆しています。ループ制限に正確に達する可能性はほとんどありません。私はあなたのループを次のように書き直します:

for( int i = 0; i < 100 ; ++i ) {
    rVoltsList.add( String.format("%.1f", i / 10.0) );
}
于 2012-06-26T14:18:37.777 に答える
2
DecimalFormat dtime = new DecimalFormat("#.#"); 

for( double i = 0; i < 10 ; i+=0.1 ) 
{   
    String i2= Double.valueOf(dtime.format(i));
    rVoltsList.add( Double.toString( i2 ) );
}
于 2012-06-26T14:18:19.790 に答える