JavaScript는 십진법에 문제가 있습니다

2888 단어 javascript
JavaScript는 이상한 방식으로 십진수를 처리합니다. 예를 들어 다음을 수행하면 어떻게 됩니까?

const number = 0.1 + 0.2
console.log(number);
// ☝️ It doesn't output 0.3,
//    but 0.30000000000000004!


여기서 일어나는 일은 JavaScript(및 다른 언어)가 십진수를 처리한다는 것입니다. 내부적으로는 부동 소수점 산술에 IEEE 754 표준을 사용합니다.

부동 소수점 산술은 컴퓨터가 10진수 값을 저장할 수 있는 가장 일반적인 방법이며 IEEE 754 표준은 밑이 2인 표준입니다. 즉, 컴퓨터가 데이터를 처리하는 방식인 이진수(예: "0"및 "1")로 작동하도록 설계되었습니다.

밑이 2인 시스템에서 밑이 10인 10진수를 저장하려고 하면 문제가 나타납니다. 숫자 "0.1"을 저장하고 싶다고 가정해 보겠습니다. 이진 형식으로 저장하려는 경우 숫자는 다음과 같습니다.

0 . 000110011100110011100110011001100110011001100111001100110011001100110011001100110011001100110011001110011001100110011001100110011001100111110011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 추출 추출도 1111100110011001100110011001100110011111111111111111 미오까지 미입니다.

"0011"시퀀스가 ​​무한 반복됩니다! "3.333333..."과 같이 10진수로 10/3을 쓰려는 경우와 정확히 같은 일이 발생합니다.

분명히, 무한대의 소수점을 저장하는 것은 불가능합니다. 어딘가에서 잘라내야 합니다. 그러나 그것은 또한 숫자를 저장할 때 약간의 정밀도를 잃는다는 것을 의미합니다. 그 컷오프와 그로 인한 정밀도 손실 후 실제로 저장되는 숫자는 0.100000001490116119384765625"입니다. 밑이 2인 시스템에서 이 문제는 많은 경우에 발생합니다.

대부분의 사람들은 그렇게 정확할 필요가 없습니다. 이것이 JavaScript 엔진이 일반적으로 일부 디지털 숫자를 제거하기 위해 반올림을 사용하는 이유입니다.

값이 "0.1"인 변수를 만드는 경우(즉, "0.100000001490116119384765625"로 저장됨) 해당 변수를 가져올 때 추가 숫자가 제거되고 "0.1"을 다시 얻게 됩니다.

그러나 반올림 방법이 작동하지 않는 상황이 있으며 결과는 이상한 소수 자릿수가 많은 숫자입니다.

실제로 정밀도가 필요한 경우 어떻게 해야 합니까?



십진수 정밀도가 필요한 상황이 있습니다. 예를 들어 돈을 다룰 때입니다. 십진수를 직접 사용하지 마십시오. 대신 decimal.js 과 같은 라이브러리를 사용하십시오.

추가 자료



더 읽어보고 싶다면 floating-point-gui.de 을(를) 제안합니다. 문제와 부동 소수점 산술 작동 방식에 대한 간단한 설명입니다.

재미있는 도구를 가지고 놀고 싶다면 IEEE-754 Floating Point Converter 이 있습니다. 해당 사이트에서 숫자를 입력하고 실제로 무엇이 저장되고 있는지 확인할 수 있습니다.


이 기사가 마음에 드셨다면 제 JavaScript 뉴스레터도 마음에 드실 것입니다.
격주 월요일마다 JavaScript 기술 수준을 높일 수 있는 쉽고 실행 가능한 단계를 보내드립니다. 확인해보세요: https://nicozerpa.com/newsletter

좋은 웹페이지 즐겨찾기