Độ chính xác của dấu phẩy động JavaScript

Trong hướng dẫn này, chúng tôi sẽ giải thích Số JavaScript. bất động sản EPSILON. Nó biểu thị sự khác biệt giữa 1 và số dấu phẩy động nhỏ nhất lớn hơn 1. Nó tồn tại bởi vì không phải tất cả các số thập phân đều có thể được biểu diễn chính xác và chính xác trong hệ thống nhị phân

Mục lục

Vấn đề độ chính xác của dấu phẩy động

Các máy tính sử dụng hệ thống nhị phân để lưu trữ các số và sử dụng số học dấu phẩy động, trong khi trong thế giới thực, chúng tôi sử dụng hệ thống thập phân. Không phải tất cả các số thập phân đều có thể được biểu diễn chính xác dưới dạng số nhị phân

Ví dụ

0.1 khi được chuyển đổi từ số thập phân sang số nhị phân cho kết quả là 0.0001100110011001101. Bây giờ chuyển ngược lại từ nhị phân sang thập phân sẽ cho kết quả là 0.1000003814697265625

Trường hợp trên tương tự như cách 1/3 ( 0. 33333) không thể được biểu diễn chính xác ở dạng thập phân

Số thập phân 10 được biểu diễn dưới dạng 1010 ở dạng nhị phân. Bây giờ chia 1 cho 1010 và bạn sẽ thấy rằng phép chia kéo dài mãi mãi giống như 1/3

Do sự mất độ chính xác ở trên xảy ra, kết quả kỳ lạ như sau xảy ra

1

2

3

4

5

6

7

8

9

10

 

bảng điều khiển. log(0. 1 + 0. 2);

bảng điều khiển. log(0. 2 + 0. 4);

bảng điều khiển. log(0. 2 + 0. 7);

 

//đầu ra

//0. 30000000000000004

//0. 6000000000000001

//0. 8999999999999999

 

Sự khác biệt là rất nhỏ, nhưng điều này chắc chắn gây ra vấn đề khi bạn so sánh hai kết quả. Ví dụ, các kết quả sau đây là false chứ không phải là true

1

2

3

4

5

6

 

bảng điều khiển. log((0. 1 + 0. 2) == . 3);  

 

//đầu ra

//SAI

 

Con số. EPSILON

Một trong những cách để tránh những vấn đề như vậy là sử dụng một con số rất nhỏ làm dung sai để so sánh. Nếu sự khác biệt giữa các số được so sánh nhỏ hơn dung sai, thì chúng được coi là bằng nhau

JavaScript cung cấp thuộc tính tĩnh EPSILON của đối tượng Số dưới dạng dung sai được xác định trước. Đó là sự khác biệt giữa 1 và số dấu phẩy động nhỏ nhất lớn hơn 1

1

2

3

4

5

6

 

bảng điều khiển. log(Số. EPSILON)

 

//đầu ra

//2. 220446049250313e-16

 

Nếu hiệu giữa hai số nhỏ hơn EPSILON thì chúng được coi là bằng nhau

1

2

3

4

5

6

7

 

function numberEquals(x. số, y. số) {

  trả về Toán. abs(x - y . ) < Number.EPSILON;

}

 

bảng điều khiển. log(numberEquals(0. 1 + 0. 2, 0. 3)); // true

 

Số____7_______ là một , , và thuộc tính

Bản tóm tắt

Việc chuyển đổi từ số thập phân sang nhị phân không phải lúc nào cũng chính xác. Nó có thể dẫn đến mất độ chính xác. Rõ ràng là khi bạn so sánh hai số (ví dụ:. (0.1 + 0.2) ==.3), những người được cho là bình đẳng nhưng kết quả là sai. Number.EPSILON được sử dụng làm dung sai cho phép so sánh số. Nếu sự khác biệt giữa các số nhỏ hơn Number.EPSILON, thì chúng được coi là bằng nhau

Tại sao 0. 1 0. 2 không phải là 0. 3 JavaScript?

Trong trường hợp 0. 1 + 0. 2 , máy tính tính ra kết quả là 0. 30000000000000004 , không chính xác bằng 0. 3. Đây chỉ là giả tạo về cách các số được biểu diễn trong máy tính và không phản ánh bất kỳ lỗi nào trong mã JavaScript .

Làm cách nào để định dạng float đến 2 chữ số thập phân trong JavaScript?

Để giới hạn số chữ số tối đa 2 vị trí sau dấu thập phân, phương thức toFixed() được sử dụng. Phương thức toFixed() làm tròn số dấu phẩy động lên đến 2 vị trí sau dấu thập phân.

Độ chính xác của chữ số trong JavaScript là gì?

Loại JavaScript Number là định dạng nhị phân 64 bit có độ chính xác kép, giá trị IEEE 754 , giống như double trong Java hoặc C#.

Làm cách nào để có được giá trị chính xác trong JavaScript?

toPrecision() Phương thức toPrecision() trả về một chuỗi đại diện cho đối tượng Number với độ chính xác đã chỉ định.