찾다
웹 프론트엔드JS 튜토리얼me_javascript 기술로 자바스크립트 부동 소수점 정밀도 배우기

대부분의 프로그래밍 언어에는 여러 가지 숫자 데이터 유형이 있지만 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의 부동 소수점 숫자에 대한 소개입니다. 부동 소수점 연산의 정밀 트랩에 항상 주의해야 합니다. 이 기사가 모든 사람의 학습에 도움이 되기를 바랍니다.

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
es6数组怎么去掉重复并且重新排序es6数组怎么去掉重复并且重新排序May 05, 2022 pm 07:08 PM

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

JavaScript的Symbol类型、隐藏属性及全局注册表详解JavaScript的Symbol类型、隐藏属性及全局注册表详解Jun 02, 2022 am 11:50 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

原来利用纯CSS也能实现文字轮播与图片轮播!原来利用纯CSS也能实现文字轮播与图片轮播!Jun 10, 2022 pm 01:00 PM

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

JavaScript对象的构造函数和new操作符(实例详解)JavaScript对象的构造函数和new操作符(实例详解)May 10, 2022 pm 06:16 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

javascript怎么移除元素点击事件javascript怎么移除元素点击事件Apr 11, 2022 pm 04:51 PM

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

JavaScript面向对象详细解析之属性描述符JavaScript面向对象详细解析之属性描述符May 27, 2022 pm 05:29 PM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

foreach是es6里的吗foreach是es6里的吗May 05, 2022 pm 05:59 PM

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。

整理总结JavaScript常见的BOM操作整理总结JavaScript常见的BOM操作Jun 01, 2022 am 11:43 AM

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.