2012-06-26 2 views
-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 

아이디어 : 그러나, 이것은 내 프로그램을 실행하면 목록이 보이는 무엇인가?

+0

[두 번에 걸쳐 소수점 이하 자릿수를 이동]의 중복 가능성 (http://stackoverflow.com/questions/4937402/moving-decimal-places-over-in-a -double) – assylias

답변

5

사용이 :

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

문제는 하지 않습니다 라운드입니다.

이상한 값은 0.1 (기본 10)이 자바에서 double으로 정확한 표현을하지 못하기 때문에 루프 변수에 추가 할 때마다 무엇인가 조금 다른 것을 추가하는 것입니다. 당신은 생각합니다 (만약 당신이 그 말장난을 용서할 것입니다).

같은 반올림 문제는 double을 루프 변수로 사용하지 않아야 함을 나타냅니다. 루프 한계를 정확히 맞추기 란 거의 불가능합니다. 다음과 같이 내가 루프를 다시 작성합니다 :

for(int i = 0; i < 100 ; ++i) { 
    rVoltsList.add(String.format("%.1f", i/10.0)); 
} 
+0

이 작동하지만 이해할 수 없습니다 .... 경우에만 0.1을 추가하는 경우 가치, 나는 그 이상한 가치를 어떻게 얻습니까? – JuiCe

+2

@JuiCe - 문제는 복식으로 계산하는 것이 일반적으로 정확하지 않다는 것입니다. 특히 (기본 10) 값 0.1은 2 진수로 정확한 표현을 갖지 않습니다. 따라서 합계의 마지막 비트 또는 두 개가 꺼집니다. 이 반올림 오류는 숫자에 0.1을 더할수록 더 자주 악화됩니다. –

+0

@JuiCe - 부동 소수점 계산에서의 반올림 오류와 같은 문제 때문에 'int' 루프 변수를 사용하고 루프 내에서'i/10.0'을 계산하도록 루프를 수정해야합니다. 문제는 당신이 10.0의 어느 쪽이 마지막 반복에서 착륙 할 것인가를 쉽게 예측할 수 없다는 것이다. 루프를 작성한 방식에서 9.999999999999999999 값 (10.0으로 반올림 한 후)을 원하지 않는 것처럼 보입니다. –

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)); 
} 
+2

될 것이라고 .... rVoltsList.add (i2); ? – JuiCe

+0

Thanks ...... @JuiCe – MAC

+0

이 방법을 사용하면 'dtime'의 선언을 루프 밖으로 이동해야합니다. 각 반복마다 새 DecimalTime을 만들 필요가 없습니다. –

관련 문제