me_javascript 기술로 자바스크립트 부동 소수점 정밀도 배우기

WBOY
풀어 주다: 2016-05-16 15:32:19
원래의
911명이 탐색했습니다.

대부분의 프로그래밍 언어에는 여러 가지 숫자 데이터 유형이 있지만 JavaScript에는 하나만 있습니다. typeof 연산자를 사용하여 숫자의 유형을 확인할 수 있습니다. 정수인지 부동 소수점 숫자인지에 관계없이 JavaScript는 단순히 숫자로 분류합니다.

typeof 17; //number
typeof 98.6; //number
typeof -21.3; //number
로그인 후 복사

사실 JavaScript의 모든 숫자는 배정밀도 부동 소수점 숫자입니다. 이는 IEEE754 표준에 따라 지정된 64비트로 인코딩된 숫자("더블")입니다. 이 사실로 인해 JavaScript가 정수를 어떻게 나타내는지 궁금하다면 배정밀도 부동 소수점 숫자가 최대 53자리의 정밀도까지 정수를 완벽하게 나타낸다는 점을 기억하세요. -9 007 199 254 740 992(-253)부터 9 007 199 254 740 992(253)까지의 모든 정수는 유효한 배정밀도 부동 소수점 숫자입니다. 따라서 JavaScript에는 명확한 정수 유형이 없음에도 불구하고 정수 산술이 완벽하게 가능합니다.
대부분의 산술 연산자는 정수, 실수 또는 이 둘의 조합을 사용하여 계산을 수행할 수 있습니다.

0.1 * 0.9; //0.19
-99 + 100; //1
21- 12.3; //8.7
2.5 /5; //0.5
21%8; //5
로그인 후 복사

그러나 비트 산술 연산자는 특별합니다. JavaScript는 피연산자에서 부동 소수점 숫자로 직접 연산하지 않지만 연산을 수행하기 전에 암시적으로 이를 32비트 정수로 변환합니다. (정확하게 말하면 정수의 32비트 빅엔디안 2의 보수 표현으로 변환됩니다.) 비트별 OR 표현식을 예로 들어 보겠습니다.

8|1; //9
로그인 후 복사

겉으로는 단순해 보이는 표현식이 실제로 작업을 완료하려면 여러 단계가 필요합니다. 앞서 언급했듯이 JavaScript의 숫자 8과 1은 모두 배정밀도 부동 소수점 숫자입니다. 그러나 32비트 0과 1의 시퀀스인 32비트 정수로 표현될 수도 있습니다. 정수 8은 다음과 같이 32비트 바이너리 시퀀스로 표현됩니다.

00000000000000000000000000001000

숫자 유형의 toString 메소드를 사용하여 직접 볼 수도 있습니다.

(8).toString(2) //"1000"

toString 메소드의 매개변수는 변환 기준을 지정합니다. 이 예는 기본 2(즉, 이진수)로 표현됩니다. 결과 값은 최종 값에 영향을 주지 않기 때문에 왼쪽에 있는 추가 0(비트)을 생략합니다.
정수 1은 다음과 같이 32비트 바이너리로 표현됩니다.

00000000000000000000000000000001

비트별 OR 표현식은 두 개의 비트 시퀀스를 결합합니다. 연산에 포함된 두 비트 중 하나라도 1이면 연산 결과의 비트는 1이 됩니다. 비트 패턴으로 표현한 결과는 다음과 같습니다.

00000000000000000000000000001001

이 시퀀스는 정수 9를 나타냅니다. 표준 라이브러리 함수인 parInt를 사용하여 확인할 수 있으며, 베이스 2도 사용할 수 있습니다.

parseInt("1000", 2); //9
로그인 후 복사

(역시 연산 결과에 영향을 주지 않으므로 앞에 0비트가 필요하지 않습니다.)
모든 비트 연산자는 동일한 방식으로 작동합니다. 피연산자를 정수로 변환한 다음 정수 비트 패턴을 사용하여 연산을 수행하고 마지막으로 결과를 표준 JavaScript 부동 소수점 숫자로 변환합니다. 일반적으로 JavaScript 엔진은 이러한 변환을 수행하기 위해 몇 가지 추가 작업을 수행해야 합니다. 숫자는 부동 소수점 숫자로 저장되므로 정수로 변환한 다음 다시 부동 소수점 숫자로 변환해야 합니다. 그러나 어떤 경우에는 산술 표현식이나 심지어 변수도 정수로만 작동할 수 있으며 최적화 컴파일러는 때때로 이러한 상황을 추론하고 중복 변환을 피하기 위해 숫자를 내부적으로 정수로 저장할 수 있습니다.

부동 소수점 숫자에 대한 마지막 경고는 항상 조심해야 한다는 것입니다. 부동 소수점 숫자는 친숙해 보일 수 있지만 부정확한 것으로 악명이 높습니다. 겉으로는 단순해 보이는 일부 산술 연산이라도 잘못된 결과를 낳을 수 있습니다.

0.1 0.2;0.300000000000004

64비트의 정밀도는 상당히 높지만 배정밀도 부동 소수점 숫자는 제한된 숫자 집합만 나타낼 수 있고 전체 실수 집합을 나타낼 수는 없습니다. 부동 소수점 연산은 가장 가까운 표현 가능한 실수로 반올림된 대략적인 결과만 생성할 수 있습니다. 일련의 작업을 수행하면 반올림 오류가 누적되면서 결과의 정확도가 점점 낮아집니다. 반올림은 우리가 일반적으로 기대하는 산술 법칙에서 예상치 못한 편차를 일으킬 수도 있습니다. 예를 들어, 실수는 결합법칙을 충족합니다. 즉, 모든 실수에 대해 x, y, z, (x y) z = x (y z)가 항상 충족된다는 의미입니다.

그러나 부동 소수점 숫자의 경우 항상 그런 것은 아닙니다.

(0.1+0.2)+0.3; //0.60000000000000001
0.1+(0.2+ 0.3); //0.6

로그인 후 복사

부동 소수점 숫자는 정밀도와 성능을 절충합니다. 정밀도에 관심을 가질 때 부동 소수점 수의 제한에 주의하십시오. 효율적인 해결책은 가능할 때마다 정수 값 산술을 사용하는 것입니다. 정수는 반올림 없이 표현되기 때문입니다. 통화 관련 계산을 수행할 때 프로그래머는 계산을 정수로 수행할 수 있도록 계산을 수행하기 전에 값을 가장 작은 화폐 단위로 비례적으로 변환하는 경우가 많습니다. 예를 들어, 위 계산이 미국 달러인 경우 이를 센트의 정수 표현으로 변환할 수 있습니다.

(10+20)+30; //60
10+ (20+30); //60
로그인 후 복사

정수 연산의 경우 반올림 오류에 대해 걱정할 필요가 없지만 모든 계산은 -253부터 253까지의 정수에만 적용된다는 점에 유의해야 합니다.

  • 자바스크립트 숫자는 모두 배정밀도 부동 소수점 숫자입니다.
  • JavaScript의 정수는 별도의 데이터 유형이 아닌 배정밀도 부동 소수점 숫자의 하위 집합일 뿐입니다
  • 비트 연산자는 숫자를 32비트 부호 있는 정수로 처리합니다.

위는 JavaScript의 부동 소수점 숫자에 대한 소개입니다. 부동 소수점 연산의 정밀 트랩에 항상 주의해야 합니다. 이 기사가 모든 사람의 학습에 도움이 되기를 바랍니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!