2012-05-12 6 views
0

가능한 중복 : 가정하자
Is JavaScript's Math broken?자바 스크립트 : 정밀 이상한 행동

,

var x = .6 - .5; 

var y = 10.2 – 10.1; 

var z = .2 - .1; 

비교 결과

x == y;  // false 

x == .1; // false 

y == .1; // false 
,451,515,

하지만

z == .1; // true 

왜 자바 스크립트 쇼 그런 행동?

+2

처음 두 비교는 조금 이상합니다. 왜 당신은 그 (것)들을 일치 할 것으로 예상 할 것입니까? (-0.1 vs 0.1) – Mat

+0

관련 항목 : http://stackoverflow.com/questions/1458633/elegant-workaround-for-javascript-floating-point-number-problem – BasTaller

답변

6

부동 소수점이 완벽하게 정확하지 않기 때문에. 당신은 결국 차이로 끝날 수 있습니다.

(사이드 노트 : 나는 당신이 0.1-0.1을 비교하고, 당신이 그렇지 않으면 var x = .6 - .5;을 의미 생각합니다.)

자바 스크립트 IEEE-754 배정 밀도 64 비트 부동 소수점 (ref)를 사용합니다. 이것은 매우 좋은 부동 소수점 수의 근사값이지만 모든 부동 소수점 수를 이진수로 표현하는 완벽한 방법은 없습니다.

일부 불일치는 다른 것보다보기가 쉽습니다. 예를 들어 :

console.log(0.1 + 0.2); // "0.30000000000000004" 

는 C#의 decimal 유형 또는 Java의 BigDecimal 일품은 "소수"일을 거기에 약간의 자바 스크립트 라이브러리가있다. 그것이 실제로 숫자가 일련의 10 진수로 저장되는 곳입니다. 그러나 그들은 만병 통치약이 아니며 단지 다른 종류의 문제를 가지고 있습니다. 예를 들어 1/3을 정확히 나타내려고합니다. "십진법"유형/라이브러리는 재정적 인 애플리케이션에서 환상적입니다. 금융 상품에 필요한 반올림 스타일을 처리하는 데 익숙하기 때문에 그렇지만 IEEE 부동 소수점보다 느린 경향이 있습니다.

하자 출력 할 xy 값 :

var x = .6 - .5; 
console.log(x); // "0.09999999999999998" 

var y = 10.2 - 10.1; 
console.log(y); // "0.09999999999999964" 

없음 큰 놀라움 0.099999999999999980.09999999999999964-!=입니다.

function roundTwoPlaces(num) { 
    return Math.round(num * 100)/100; 
} 

var x = roundTwoPlaces(0.6 - 0.5); 

var y = roundTwoPlaces(10.2 - 10.1); 

console.log(x);  // "0.1" 
console.log(y);  // "0.1" 
console.log(x === y); // "true" 

또는 더 일반화 된 솔루션 : :-)

당신은 비교 작업을하기 위해 그 조금을 합리화 할 수

function round(num, places) { 
    var mult = Math.pow(10, places); 
    return Math.round(num * mult)/mult; 
} 

Live example을 | source

결과 숫자에 정확도 crud가 가능하지만 동일한 숫자의 숫자가 round 인 경우 두 개 이상의 숫자가 매우 근접해 있음을 유의하십시오. (비록 그 숫자가 완벽하게 정확하지 않더라도) 동일한 수입니다.

+0

JavaScript의 부동 소수점 정밀도를 절대 고려하지 마십시오. . =)) – benqus

+0

@benqus : Enh, 대부분의 경우 충분합니다. 자바 스크립트뿐만 아니라, 많은 시스템이 IEEE-754를 사용하는데, 이는 이상한 스마트 비트 조작입니다. –

+0

마지막 마술은 재미있는 친구가 있습니다! 나는 표준 JS가 사용하는 것에 상관없이 그것이 미친 것을 의미한다. =) 나는 당신이 괜찮다면이 해결책을 구할 것이다. 이 작은 숫자로 작동합니까? 0.00245? – benqus