2014-11-07 6 views
0

이 숫자를 계산하고 반올림 할 때 두 가지 결과가 나옵니다. 오늘은 이고 어제는입니다. 입니다. 다른 필드에서도 비슷한 문제가 있었지만 Java 코드를 업데이트 한 후에 불일치가 사라졌습니다.Android 앱과 자바 스크립트 코드의 반올림 차이점

자바 스크립트 코드 :

document.getElementById("txt1").value = ((today - yesterday)/10000).toFixed(3); 

안드로이드 코드 : 안드로이드 코드가 0.030을 반환하면서

public Double RoundDouble(Double num, Integer places) 
    { 
     Double temp = Math.pow(10.0, places); 

     num = num * temp; 
     Math.round(num); 
     num = num/temp; 

     return num; 
    } 

    Double total = RoundDouble((today - yesterday)/10000,3); 
    txt1.setText(df.format(total)); 

자바 스크립트 코드가 .031를 반환합니다. 저는 수학을했고 반올림하기 전에 숫자는 .0305입니다. 나는이 문제가 다른 문제인 원인이 무엇인지 확신 할 수 없다. .0295 to .030.

+0

다른 하드웨어 및 운영 체제에서 다른 부동 소수점 표현은 조금 다른 반올림을 처리합니다. 부동 소수점 값을 사용하면 특정 숫자를 완벽하게 표현할 수없는 경우가 있습니다. – tezromania

+0

비슷한 문제가있는 또 다른 분야가있었습니다. .0230에서 .0230으로 제대로 반올림하지 못했지만 Android 앱에서 내 반올림 메소드를 변경 한 후에 해당 특정 필드에 대한 문제가 해결 된 것으로 보입니다. 나는 왜 그것이 한 분야의 문제를 해결했는지 이해하지는 못했지만 다른 문제는 해결하지 못했습니다. – Jim

+0

"document.getElementById"는 ASP 코드가 아닙니다. 클라이언트 측 코드와 비슷합니다. – Dee

답변

1

분수 ((336887 - 336582)/10000)는 IEEE-754 배정도 숫자로 표시 할 수 없습니다. ((336887 - 336582)/10000).toFixed(20)을 시도하면 0.03049999999999999933이 표시됩니다. Android 버전이 다른 이유는 Math.round(num)의 결과를 처리하는 방식 일 수 있습니다. 무시하면됩니다. 이 행을 num = Math.round(num);으로 변경하는 것이 더 유용 할 수 있습니다. Android에서 rounding mode을 변경할 수도 있습니다. ECMAScript의 기본 반올림 모드는 Android에서 HALF_EVEN 인 가장 가까운 것입니다.

+0

반올림과 관련된 모든 코드를'num = Math.round (num * temp)/temp; '로 통합하면 문제가 해결됩니다. 도와 주셔서 감사합니다! 이 코드로 답을 자유롭게 업데이트하십시오. – Jim