2013-02-13 1 views
1

나는이 추가 기능JQuery와는 - 소수점이있는 두 개의 숫자를 추가 제공 잘못 총

입니다

function GetTotal() { 

      var value1 = txtText1.val(); 
      var value2 = txtText2.val(); 
       var sum = add(value1, value2) 

       $('input:text[id$=txtSubTotals]').val(sum); 
} 

텍스트 상자

$('input:text[id$=txtText1]').change(GetTotal); 

이 호출 GetTotal 기능에 변경 이벤트에서 다음 JQuery와 기능이

function add() { 
      var sum = 0; 
      for (var i = 0, j = arguments.length; i < j; i++) { 
       if (IsNumeric(arguments[i])) { 
        sum += parseFloat(arguments[i]); 
       } 
      } 
      return sum; 
     } 

텍스트 상자 1에서 값은 1.45이고 텍스트 상자 2에서는 2.89가 아닌 1.44입니다. . 나는 다음과 같은 가치를 얻고있다 2.8899999999999997

+2

는 http://stackoverflow.com/questions/588004/is-javascripts-floating-point-math-broken – j08691

+0

피하기 부동 소수점 연산을 참조하십시오 - 당신이 정말로 필요한 경우에 "정수"수학을 부품 (즉, 소수점 이하 부분과 소수점 이하 부분)은 완료되면 다시 함께 놓습니다 – kinakuta

답변

4

세계에 오신 것을 환영합니다. 인터넷에서 이것에 대해 많이 쓰여 있습니다.하지만 이것은 자바 스크립트와 다른 언어에서 부동 소수점 연산의 형식이 작동하는 방식입니다. 부동 소수점 문제는 많은 기사에서 읽을 수 있습니다. 여기에 one입니다. 문제는 일부 정상 십진수 값을 부동 소수점 형식으로 정확하게 표현할 수 없으므로 예상했던 것에서 작은 오류가 발생한다는 것입니다.

일반적으로 원래 숫자에서 많은 소수점을 사용하지 않는 경우 값을 소수점 이하로 반올림하면 불일치가 제거됩니다.

예를 들어, 2.89를 얻으려면 소수점 이하의 특정 숫자로 값을 반올림하고 원하는 답을 얻을 수 있습니다.

당신은 다음과 같이 총 필드에 넣어하는 방법을 변경할 수 있습니다

:

$('input:text[id$=txtSubTotals]').val(sum.toFixed(2)); 

또는, 당신도 sum.toFixed(6) 같이 6 같은 값을 사용할 수 있고 여전히 문제를 해결할 것입니다.

매우 중요한 재무 계산과 같은 완벽한 정밀도를 원한다면 정확한 재무 계산을 위해 부동 소수점을 사용하지 않는 라이브러리가 있거나 실제로는 센트의 정수로 변환하여 모든 수학 연산을 수행 할 수 있습니다 센트로서 소수점 만 맨 끝으로 되돌립니다.

관련 문제