我正在使用以下代码在我的一个活动中填充Spinner ......
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
任何想法?
答案 0 :(得分: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) );
}
答案 1 :(得分: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 ) );
}