2016-08-18 2 views
0

아무도 내가 잘못한 것을 알고 있습니까? 나는 부동 소수점 숫자를 얻었고, 0.04라고 말해 보자. 형식 뒤에 0.03으로 바뀝니다. 출력 결과는 이미 0.01보다 낮습니다. 사전에DecimalFormat이 잘못된 결과를 반환합니다.

float creditAvailableProportion = this.accountSummary != null ? (this.accountSummary.getCreditAvailable()/this.accountSummary.getCreditLimit()) : 0; 
     DecimalFormat decimalFormat = new DecimalFormat("#.##"); 
     decimalFormat.setRoundingMode(RoundingMode.FLOOR); 
     float formattedCreditAvailableProportion = Float.parseFloat(decimalFormat.format(creditAvailableProportion)); 

     return Math.min(1.0f, formattedCreditAvailableProportion); 

감사 :

여기 내 코드입니다.

+2

'System.out.println (decimalFormat.format (0.04));'prints'0.04'; '0.04'보다 적은 값으로 호출하고 있습니다 (*는'0.03'으로 flooring * 될 것입니다). –

+0

@Long'this.accountSummary.getCreditAvailable()'과'this.accountSummary.getCreditLimit()'의 값을 나누면 0.04라는 것을 보여줄 수 있습니까? – mapeters

+0

형식을 지정하지 마십시오. 그것을 2 개의 십진수로 반올림하십시오. 너 괜찮을거야. –

답변

0

이 디버깅 방법 :

실행이 코드를, 당신의 문제가 명확하게해야합니다

float creditAvailableProportion = this.accountSummary != null ? (this.accountSummary.getCreditAvailable()/this.accountSummary.getCreditLimit()) : 0; 
System.out.println(creditAvailableProportion)    //Original value 
DecimalFormat decimalFormat = new DecimalFormat("#.##"); 
decimalFormat.setRoundingMode(RoundingMode.FLOOR); 
String temp = decimalFormat.format(creditAvailableProportion); 
System.out.println(temp);          //formatted string 
float formattedCreditAvailableProportion = Float.parseFloat(decimalFormat.format(creditAvailableProportion)); 
System.out.println(formattedCreditAvailableProportion);   //Parsed float. 

return Math.min(1.0f, formattedCreditAvailableProportion); 

는 희망이 조금 물고기를 가르 칠 것입니다.

+0

나는 이것이 왜곡 된 것 같지만 확실하지 않은 이유 : decimalFormat.setRoundingMode (RoundingMode.FLOOR); –

+0

글쎄, 어떤 값이 올바른 숫자가 아닌 첫 번째 값 이었습니까? 내 코드로 세 값을 출력해야합니다. 그 사람들은 뭐야? –

+0

임시 값이 잘못되었습니다. –

0

또한 Math.floor()를 시도해 볼 수 있습니다. 문자열로 바꾸거나 사용하지 않는 것은 사용하지 마십시오.

float temp = 7.888888f; 
temp = temp * 100; 
     temp = (float) Math.floor((double)temp); 
     temp = temp /100; 
     System.out.println(temp); 
2

아무도 문제를 설명하지 않았으므로 어떤 일이 발생했는지 간략하게 설명하겠습니다. Java를 포함한 대부분의 시스템에서 부동 소수점 숫자는 정확하지 않습니다. 즉 .04는 내부적으로 .03999999999 또는 .040000001 또는 이와 유사한 형태로 저장됩니다. 따라서 바닥 형식으로 포맷하면 .03으로 끝날 수 있습니다. 해결 방법은 반올림 형식을 사용하거나 형식 앞에 값에 .0000001을 추가하는 것입니다. 그런 식으로 바닥을 옳게 만들 것입니다.
또 다른 방법은 가능한 경우 부동 소수점을 덤프하고 Android가 지리 좌표로 수행하는 것과 비슷한 정수 (예 : 1e6)를 사용하는 것입니다.

관련 문제