부동 소수점이 완벽하게 정확하지 않기 때문에. 당신은 결국 차이로 끝날 수 있습니다.
(사이드 노트 : 나는 당신이 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 부동 소수점보다 느린 경향이 있습니다.
하자 출력 할 x
및 y
값 :
var x = .6 - .5;
console.log(x); // "0.09999999999999998"
var y = 10.2 - 10.1;
console.log(y); // "0.09999999999999964"
없음 큰 놀라움 0.09999999999999998
그 0.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.1 vs 0.1) – Mat
관련 항목 : http://stackoverflow.com/questions/1458633/elegant-workaround-for-javascript-floating-point-number-problem – BasTaller