2013-10-16 2 views
2

매번 0.1을 뺀 간단한 간격이 있습니다.예기치 않은 값을주는 자바 스크립트 뺄셈

1 
0.9 
0.8 
0.7000000000000001 
0.6000000000000001 
0.5000000000000001 
0.40000000000000013 
0.30000000000000016 
0.20000000000000015 
0.10000000000000014 
1.3877787807814457e-16 

가 왜이 미친 수를하고있다 :

function transition_opacity(div_id,opacity){ 
    opacity = 1; //temporary test 
    var IntervId = setInterval(process_transition,30); 

    function process_transition(){ 
     console.log(opacity); //check the value 
     opacity = opacity - 0.1 
     div_id.style.opacity = opacity; 
    if(opacity < 0.0){ 
      rmv_div(div_id); 
      clear(); 
     } 
    } 

    function clear(){ 
     clearInterval(IntervId); 
    } 
} 

콘솔 로그 opacity의 값이 표시됩니다 :하지만 연속 된 번호가 3 번 반복 후 이상한 간다 ...이 내가 무엇을 가지고 시퀀스 =/나에게 의미가있는 것 같아요 ... 그것은 잘 작동합니다. 0.8

+0

아우, 부동 소수점 숫자입니다. 개자식들. 어쩌면이 도움이 될 것입니다 : http://floating-point-gui.de/ – acdcjunior

+0

예 : http://stackoverflow.com/questions/963873/1-265-10000-126499-99999999999 –

답변

1

부동 소수점 수를 저장하는 방식으로 완벽하게 표현할 수없는 일부 값에 대해서는 부동 소수점 연산이 정확하지 않습니다. 당신이보고있는 모두 정확한 값에 약간의 차이가 있습니다.

일반적으로 값을 특정 소수 자릿수로 반올림하여 해결할 수 있습니다. 주제에 대한 간단한 Google 검색을 사용하여 부동 소수점 정확도에 대해 원하는만큼 읽을 수 있습니다. 고전적인 해결 방법은 소수점 이하의 특정 숫자로 값을 반올림하는 것입니다.

그러나 실제로는 값이 작은 불일치가 있더라도 < 0을 찾고 있기 때문에 함수가 실제로 정상적으로 작동합니다.이 함수는 적절한 반복 횟수를 제공합니다.

당신은 실제로 제대로 작동하도록 기능이 필요하지 않습니다,하지만 당신은 정확하게 값을 원한다면, 당신은이 같은 라운드에 소수점 자리 수 :

function transition_opacity(div_id,opacity){ 
    var opacity = 1; //temporary test 
    var IntervId = setInterval(process_transition, 30); 

    function process_transition(){ 
     console.log(opacity); //check the value 
     opacity = Math.round((opacity - 0.1) * 100)/100; 
     div_id.style.opacity = opacity; 
     if (opacity < 0) { 
      rmv_div(div_id); 
      clear(); 
     } 
    } 

    function clear(){ 
     clearInterval(IntervId); 
    } 
} 

는 참고로, 나는 또한 수 opacity 선언 지역 변수.

+0

내 JSFiddle에서'<0'에 대한 검사가 여전히 작동하지 않는 것 같았습니다. http://jsfiddle.net/ 4kWCB/12/ – Sir

+0

@Dave - 내 코드는 http://jsfiddle.net/jfriend00/8Yc7k/에서 사용할 수 있습니다. 왜 내가 너와 일하지 않는지 살펴볼 것이다. – jfriend00

+0

@Dave - div_id가 DOM 요소가 아닌 문자열이기 때문에 불투명도가 확인되고 매번 중단되기 전에'process_transition()'함수는 예외를 throw합니다. 내 jsFiddle에서 div_id가 DOM 요소로 바뀌 었는지 확인하거나 문제가 수정 된 코드를 http://jsfiddle.net/jfriend00/mM7wQ/에서 확인하십시오. 이와 같은 상황에서 어떤 일이 잘못 될지 종종 보여주기 때문에 브라우저 오류 콘솔을 확인하는 것을 잊지 마십시오. – jfriend00

0

부동 숫자가 표시되는 방식 때문입니다. 컴퓨터는 얻을 수있는대로 정확히 0.7 값을 제공합니다. 그러나 기본 10을 사용하지 않기 때문에 0.7에 도달 할 수있는 가장 정확한 값은 0.7000000000000001입니다. 다른 0.1을 뺄 때 똑같은 일이 일어납니다.

0

자바 스크립트 부동 소수점은 이런 종류의 문제로 알려져 있습니다. 그것은 (그리고 나는 the good book을 여기에 인용했다.) "[Javascript]는 이진 부동 소수점 연산 (IEEE 1754)을위한 IEEE 표준을 채택했다.

정수 값으로 작업하는 것이 좋습니다. 시나리오에서는 불투명도 값에 100을 곱하고 계산을 한 다음 100으로 나누어 값을 10 진수 값으로 다시 변환하는 것이 합리적입니다.

관련 문제