Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 奇怪的双字符串转换_Android_Double - Fatal编程技术网

Android 奇怪的双字符串转换

Android 奇怪的双字符串转换,android,double,Android,Double,我正在使用以下代码在我的一个活动中填充微调器 for( double i = 0; i < 10 ; i+=0.1 ) { rVoltsList.add( Double.toString( i ) ); } Spinner rVoltsSpinner = (Spinner) findViewById( R.id.recloseVoltsSpinner ); ArrayAdapter<String> rVoltsAdapter =

我正在使用以下代码在我的一个活动中填充微调器

    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 );
有什么想法吗?

DecimalFormat dtime=newdecimalformat(“#.#”);
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 ) );
}
对于(双i=0;i<10;i+=0.1) { 字符串i2=Double.valueOf(dtime.format(i)); rVoltsList.add(Double.toString(i2)); }
使用以下方法:

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) );
}
for(int i=0;i<100;++i){
rVoltsList.add(String.format(“%.1f”,i/10.0));
}

这可能是重复的,但我不明白……如果我只在I的值上加0.1,它是如何得到这些奇怪的值的?@JuiCe-问题是双倍运算通常不精确。特别是,(基数10)值0.1没有二进制的精确表示。因此,总和的最后一位或两位将关闭。如果将0.1添加到一个数字上的次数越多,这种舍入错误通常会变得更严重。@JuiCe-由于浮点计算中存在相同的舍入错误问题,您应该修改循环以使用
int
循环变量,并在循环内计算
i/10.0
。问题是,您无法轻松预测在上一次迭代中(在添加了100个不完全是0.1的元素之后)将在10.0的哪一侧着陆。从您编写循环的方式来看,您似乎不希望看到9.99999999999999998值(舍入到10.0后)。如果使用此方法,则应将
dtime
的声明移出循环。无需每次迭代都创建一个新的
DecimalTime
for( int i = 0; i < 100 ; ++i ) {
    rVoltsList.add( String.format("%.1f", i / 10.0) );
}