var sum = 0; for(var i = 0; i < 10; i++) { sum += 0.1; } console.log(sum);
위 프로그램은 1을 출력할까요?
당신이 알아야 할 JavaScript 인터뷰 질문 25가지 기사에서 8번째 질문은 js가 소수 연산을 올바르게 처리할 수 없는 이유를 간략하게 설명합니다. 오늘 저는 오래된 주제를 다시 살펴보고 이 문제를 더 깊은 방식으로 분석하겠습니다.
그러나 우선, 소수 연산을 올바르게 처리하지 못하는 것은 JavaScript 언어 자체의 설계 오류가 아니라는 점에 유의해야 합니다. C, Java 등과 같은 다른 고급 프로그래밍 언어도 처리할 수 없습니다. 소수 연산을 올바르게 처리하려면:
#include <stdio.h> void main(){ float sum; int i; sum = 0; for(i = 0; i < 100; i++) { sum += 0.1; } printf('%f\n', sum); //10.000002 }
컴퓨터 내부의 숫자 표현
우리 모두는 고급 프로그래밍 언어로 작성된 프로그램이 실행되기 전에 해석, 컴파일 및 기타 작업을 통해 CPU(중앙 처리 장치)가 인식할 수 있는 기계어로 변환해야 한다는 것을 알고 있습니다. , CPU의 경우 8진수, 16진수 등의 10진수 및 10진수 체계를 인식하지 못하므로 프로그램에서 선언한 이러한 기본 숫자는 계산을 위해 2진수로 변환됩니다.
계산을 위해 삼항수로 변환해 보는 것은 어떨까요?
컴퓨터 내부는 IC(Integrated Circuit: 집적회로) 등 수많은 전자부품으로 이루어져 있습니다.
IC는 모양이 다양하며, 양쪽 또는 내부에 많은 핀이 나란히 배열되어 있습니다(그림에는 한쪽 면만 표시됨). IC의 모든 핀에는 DC 전압 0V 또는 5V의 두 가지 상태만 있습니다. 즉, 하나의 IC 핀은 두 가지 상태만 나타낼 수 있습니다. IC의 이러한 특성으로 인해 컴퓨터 내부의 데이터는 이진수로만 처리될 수 있습니다.
1비트(핀 1개)는 두 가지 상태만 나타낼 수 있으므로 이진 계산 방법은 0, 1, 10, 11, 100... 이 형식이 됩니다.
따라서 숫자 연산에서는 모든 피연산자가 연산에 참여하기 위해 이진수로 변환됩니다. 예를 들어 39는 이진수 00100111로 변환됩니다
소수의 이진 표현
위에서 언급한 것처럼 프로그램의 데이터는 연산에 포함되는 경우 이진수로 변환됩니다. 예를 들어 십진수 11.1875는 1101.0010으로 변환됩니다.
이진수에서 소수점 이하 4자리로 표현되는 수치 범위는 0.0000~0.1111입니다. 따라서 이는 4개의 소수점 0.5, 0.25, 0.125, 0.0625와 그 뒤의 비트 가중치의 조합(덧셈)만을 나타낼 수 있습니다. 소수점:
위 표에서 볼 수 있듯이 십진수 0의 다음 자리는 0.0625입니다. 따라서 0에서 0.0625 사이의 소수는 소수점 이하 4자리의 이진수로 표현할 수 없습니다. 소수점, 해당 소수점 자릿수도 늘어나는데, 아무리 자릿수를 더해도 0.1이라는 결과는 얻을 수 없습니다. 실제로 0.1을 바이너리로 변환하면 0.00110011001100110011이 됩니다... 0011은 무한 반복된다는 점 참고하세요:
console.log(0.2+0.1); //操作数的二进制表示 0.1 => 0.0001 1001 1001 1001…(无限循环) 0.2 => 0.0011 0011 0011 0011…(无限循环)
js의 Number형은 C/Java처럼 정수형, 단정밀도, 배정밀도 등으로 구분되지 않고 배정밀도 부동소수점형으로 일률적으로 표현됩니다. IEEE 규정에 따르면 단정밀도 부동 소수점 숫자는 모든 소수를 표현하기 위해 32비트를 사용하고, 배정밀도 부동 소수점 숫자는 모든 소수를 표현하기 위해 64비트를 사용합니다. 부동 소수점 숫자는 부호, 가수, 지수 및 밑수로 구성됩니다. , 따라서 모든 숫자가 사용되는 것은 아닙니다. 소수, 기호, 지수 등도 숫자를 차지해야 하며 밑수는 숫자를 차지하지 않습니다.
배정밀도 부동 소수점 숫자의 소수 부분은 최대 52자리를 지원하므로 두 자리를 더하면 0.0100110011001100110011001100110011001100...의 소수 자릿수 제한으로 인해 잘린 이진수 문자열이 생성됩니다. 이때 부동소수점 숫자를 10진수로 변환하면 0.30000000000000004가 됩니다.
요약
js는 다른 고급 프로그래밍 언어를 포함하여 소수 연산을 올바르게 처리할 수 없습니다. 이는 언어 자체의 설계 오류는 아니지만 컴퓨터 자체가 소수 연산을 올바르게 처리하지 못하는 경우가 많습니다. 소수는 이진수로 표현될 수 있습니다.
위 내용은 이 글의 전체 내용입니다. 모든 분들의 공부에 도움이 되었으면 좋겠습니다.