2015-01-20 64 views
0

이것은 아마도 논리적 인 대답을 가진 질문 일 수 있습니다. 그러나 나는 정말로 이것을 이해하지 못합니다 !! javascript 루프가 다른 결과를 내었습니다

왜이 서로 다른 결과를 않습니다

..

유일한 차이점은 루프와 while 루프 .. 심지어 루프가있는 동안 정확히 몇 번입니까 ???

array = [1.2344, 2.47373, 3.444]; 

    var total = 0, 
     total2 = 0, 
     i = array.length, 
     whileLoops = 0, 
     forLoops = 0; 

    while (i--) { 
     whileLoops++; 
     total += array[i]; 
    } 

    for (var i = 0, len = array.length; i < len; i++) { 
     forLoops++; 
     total2 += array[i]; 
    } 

    if (total !== total2) { 
     console.log("BOE") 
    } 

나는에서는 parseFloat을 시도했지만이 또한

:(도움이되지 그것은 그것 때문에 요청에 방법 ???

의 종류에 자바 스크립트 엔진 라운드 번호 : 바이올린 http://jsfiddle.net/5dsx0ump/

UPDATE

은 용액 * 1000하는 제 모두 계산 한 후, 둥근 한 접점을 유지하기 위해 (1000)에 의해 다시 나눌 것인가 rs?

+0

당신은 바이올린을 주거나, 당신이 얻고있는 결과를 말해 줄 수 있습니까? –

+0

정수를 사용하면 동일한 결과를 얻을 수 있습니다. 분명히 문제는 반올림합니다. –

+0

'1.2344 + 2.47373 + 3.444 = 3.444 + 2.47373 + 1.2344' – Fabricator

답변

0

의 차이는 당신이 번호를 추가하는 것이 순서입니다.

이러한 각 추가에 대해 결과가 두 피연산자와 동일한 데이터 형식에 맞아야하므로 데이터가 약간 손실됩니다. 잃어버린 부분은 숫자가 무엇인지에 따라 달라 지므로 숫자를 다른 순서로 추가하면 결국 결과에 약간의 차이가 생깁니다.

숫자를 인쇄 할 경우 숫자가 같아 보이거나 같지 않을 수 있지만 인쇄 할 때 동일하게 보이더라도 같은 값을 가져야한다는 것은 아닙니다. 숫자는 15-17 자릿수의 정밀도를 가지지 만 인쇄 할 때 정밀도가 제한되는 것을 피하기 위해 반올림됩니다.

이것은 부동 소수점 숫자에 대한 일반적인 동작이며 부동 소수점 숫자를 사용하는 모든 프로그래밍 언어에서 동일한 결과를 보게됩니다. 부동 소수점 숫자는 단순히 정확하지 않으므로 숫자가 실제로 정확하게 있어야하는 응용 프로그램 (예 : 은행)에서는 다른 데이터 유형이 사용됩니다.

+0

고마워, 그래도 .. 나는 서로에게 숫자 op를 더하는 단순한 계산이 다른 결과를주는 것은 오히려 이상하다는 것을 알게된다.10000 부동 소수점을 포함하는 숫자를 나누면, 10000 부동 소수점이 또 하나있는 숫자로 이해할 수 있습니다. 모든 점을 '맞춰야합니다'... 이해할 수 있습니다. 콤마?? – DutchKevv

+0

@DutchKev : 예, 쉼표 뒤에 숫자가있는 거의 모든 숫자가 정상입니다. 예를 들어 '0.5'와 '0.25'와 같이 일부 숫자는 정확하게 나타낼 수 있지만 비교적 적습니다. 배열의 숫자가 부동 소수점 표현에서 어떤 것이 될지를 살펴보면 어느 것도 정확하게 표현할 수 없을 가능성이 높습니다. 각각에 대해 가장 가까운 표현을 얻을 수 있으므로 처음부터 이미 약간의 차이가 있습니다. – Guffa

+0

예를 들어 어떤 데이터 유형이 은행 관련 문제로 사용됩니까? – 1252748

0

부동 소수점 수학 (JavaScript 또는 다른 언어)에는 예상하지 못한 몇 가지 단점이 있습니다. 코드의 끝 부분이 퍼팅 :

console.log(total, total2); 

는 다음 반환

7.1521300000000005 7.15213 

지옥, 그냥 브라우저 콘솔에서 0.1 + 0.2을 넣어 당신이 무엇을 얻을 참조하십시오. 네가 기대하는 바가 아니야.

대신

다시 해싱 전체 설명을 여기에 쓰기 업 및 토론 정말 좋은있다 : 루프에서 Is floating point math broken?

+2

아니요, 자바 스크립트 부동 소수점 수학은 이상하지 않습니다. 부동 소수점 숫자를 사용하는 다른 언어와 정확히 동일합니다. – Guffa

+0

이것 좀보세요 : http://yuiblog.com/blog/2009/03/10/when-you-cant-count-on-your-numbers/ – imnancysun

+0

@imnancysun 감사합니다, 저를 위해 그것을 지워줍니다 :) – DutchKevv