JS 수치 부동 소수점에 대한 반올림 오류가있는 문제가 발생할 수 있습니다

증상 :

  결과 플러스 0.1 내지 0.2 : 0.30000000000000004는 도시 된 바와 같이 :

 

문제 원인 :

  우리는 컴퓨터가 아니라 소수보다 바이너리를 이해할 수 있다는 사실을 알고, 그래서 우리는 진 모양으로 0.1과 0.2을 넣어 :  

0.1 == "0.1.toString (2) == "0.0001100110011 ( 무한 루프 ..) 
 0.2 == "0.2.toString (2) =="0.001100110011 (무한 루프 ..)

  배정 밀도의 소수 부분이 너무 0.0100110011001100110011001100110011001100110011001100 부동 소수점 소수 자릿수의 한계로 인해 가산 한 후,이 시점에서, 우리는 다음 진수로 변환립니다 이진수의 캐릭터를 얻을 수 있도록이되고, 최대 52 부동 소수점 지원 0.30000000000000004.

  한 가지는 분명 될 :이 IEEE754 부동 소수점 계산 일반적인 문제를 사용하는 값뿐만 아니라 ECMAScript를이 문제가 있습니다. 그러나 C에서 ++ / C #을 / 자바 다음 언어로 자바 스크립트는 느슨한 타입 언어입니다 동안, 거기에 디자인 적 사고에서 부유하는 엄격한 데이터 유형 없기 때문에, 정확성의 문제를 방지 할 수있는 방법의 좋은 패키지가 정확성 오류 문제는 특히 유명하다.

 

해결 방법 :

 프로그램 : 정확도 요건은에서는 toFixed 방법으로 처리 될 수있는 경우 (방법 수치 라운딩 동작에서는 toFixed,이 방법은 큰 한계가있다)

NUM1 = 0.1이었다; 
NUM2 = 0.2이었다; 
경보 (에서는 parseFloat ((NUM1의 NUM2의 +)의 .toFixed (2)) === 0.30);

 계획 II : 일반 해결책 : 전원 n에 10를 곱한 수를 계산 할 필요는 정확하게 식별 할 수있는 컴퓨터의 정수로 변환 한 다음 10의 n 번째 전력으로 나눈 값

코드를 복사
formatNum = 함수 (F, 숫자) { 
    var에 m = Math.pow (10 자리); 
    에서는 parseInt (F에서의 m *을, 10)를 호출 / m; 
} 
VAR의 NUM1 = 0.1; 
VAR의 NUM2 = 0.2; 
경보 (Math.formatFloat (NUM1 NUM2 + 1) === 0.3)
코드를 복사

원본 링크 : https://www.cnblogs.com/lvmylife/p/9001256.html

추천

출처www.cnblogs.com/love-yu/p/10978416.html