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

Tôi đang sử dụng Javascript để hiển thị điều này nhưng so sánh dấu phẩy động này cũng có thể được nhìn thấy trong các ngôn ngữ lập trình khác, nơi chúng cũng trả về false cho so sánh này

Mã ví dụ -

console.log(0.1 + 0.2 === 0.3)
//output - false

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

  • Nó trả về false nhưng 0. 1 + 0. 2 = 0. 3 thì tại sao nó không trả về đúng?
  • Chà Những số dấu phẩy động này không thể được biểu diễn chính xác trong số dấu phẩy động Cơ sở 2. Giải thích về khái niệm cơ sở 2 này khá phức tạp để hiển thị nhưng tôi sẽ chỉ cho bạn lý do đơn giản tại sao nó lại xảy ra

console.log(0.1 + 0.2)
// output - 0.30000000000000004

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

  • Đầu ra thực tế của 2 số đó là 0. 30000000000000004 đó là lý do tại sao nó trả về sai vì chúng tôi đang so sánh điều này

console.log(0.3 === 30000000000000004)
// false

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

  • Bây giờ bạn đã hiểu tại sao nó trả về false

console.log(0.1 + 0.2 === 0.30000000000000004)
//output - true

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

  • Lần này nó sẽ trả về true

CẢM ƠN BẠN ĐÃ XEM BÀI VIẾT NÀY ❤❤

Bạn có thể liên hệ với tôi trên -
Instagram -https. //www. instagram. com/supremacism__shubh/
LinkedIn - https. //www. linkin. com/in/shubham-tiwari-b7544b193/
Email - shubhmtiwri00@gmail. com

^^Bạn có thể giúp tôi bằng cách quyên góp ở liên kết bên dưới Cảm ơn bạn👇👇 ^^
☕ --> https. //www. muameacoffee. com/waaduheck

Đồng thời kiểm tra các bài đăng này
https. // nhà phát triển. to/shubhamtiwari909/js-push-and-pop-with-arrays-33a2/edit

https. // nhà phát triển. to/shubhamtiwari909/tostring-in-js-27b

https. // nhà phát triển. to/shubhamtiwari909/join-in-javascript-4050

https. // nhà phát triển. đến/shubhamtiwari909/đi sâu vào mảng-sort-js-2n90

Ghi chú. Đó cũng là một câu hỏi phỏng vấn mà người phỏng vấn hỏi “đầu ra bằng 0. 1 + 0. 2 == 0. 3”?

Trong các câu đơn giản, lời giải thích đằng sau điều này là .
  • Máy tính sử dụng số dấu phẩy động cơ số 2 trong khi Con người (Chúng tôi) sử dụng số dấu phẩy động cơ sở 10
  • Trong hệ nhị phân, các số thập phân không thể biểu diễn chính xác tất cả các số thập phân và có các biểu diễn vô hạn
  • Vì vậy máy tính không thể biểu diễn chính xác các số như 0. 1, 0. 2 hoặc 0. 3 vì nó sử dụng định dạng dấu phẩy động nhị phân
Bây giờ hãy cùng tìm hiểu lý do cụ thể đằng sau điều này .
  • Trong hệ cơ số 10 (Được sử dụng bởi con người/chúng ta), các phân số có thể được biểu diễn chính xác nếu nó sử dụng thừa số nguyên tố của cơ số (10)
    • 2 và 5 là thừa số nguyên tố của 10
    • 1/2, 1/4, 1/5 (0. 2), 1/8 và 1/10 (0. 1) có thể được biểu diễn chính xác do mẫu số sử dụng các thừa số nguyên tố là 10
    • Trong khi đó, 1/3, 1/6 và 1/7 là các số thập phân lặp lại do mẫu số sử dụng thừa số nguyên tố là 3 hoặc 7
  • Mặt khác, trong hệ cơ số 2 (nhị phân) (Được sử dụng bởi máy tính), các phân số có thể được biểu diễn chính xác nếu nó sử dụng thừa số nguyên tố của cơ số (2)
    • 2 là ước nguyên tố duy nhất của 2
    • Vậy 1/2, 1/4, 1/8 đều có thể biểu diễn chính xác vì mẫu số sử dụng thừa số nguyên tố của 2
    • Trong khi 1/5 (0. 2) hoặc 1/10 (0. 1) đang lặp lại số thập phân
  • Vì vậy, chúng tôi kết thúc với phần còn lại cho các số thập phân lặp lại này và số đó sẽ tiếp tục khi chúng tôi chuyển đổi số cơ số 2 của máy tính thành số cơ số 10 mà con người có thể đọc được
Hãy lấy 0. 1 làm ví dụ để hiểu biểu diễn nhị phân và thập phân .
  • 0. 1 là một phần mười (1/10) và để có được biểu diễn nhị phân (nhị phân) của 0. 1, chúng ta cần sử dụng phép chia dài nhị phân để chia nhị phân 1 cho nhị phân 1010 (1/1010) như bên dưới

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

phép tính của 0. 1 thành biểu diễn nhị phân

  • Bạn có thể thấy ở trên rằng quá trình chia sẽ không bao giờ kết thúc và lặp lại mãi mãi với các chữ số trong thương vì 100 xuất hiện lại dưới dạng cổ tức
  • vì vậy biểu diễn nhị phân của số thập phân 0 của chúng ta. 1 sẽ như dưới đây

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

Đại diện của 0. 1 thành dạng nhị phân là 0. 000110011001100110011001100110011001100110011001100110011001…

  • Bây giờ kết quả trên có thể lớn hơn một chút hoặc Nhỏ hơn 0. 1 phụ thuộc vào số lượng bit chính xác được sử dụng
    • Ở độ chính xác một nửa sử dụng 11 bit quan trọng, xấp xỉ dấu phẩy động là 0. 1 có thể nhỏ hơn 0. 1
      so 0.1 rounds to 0.0001100110011 in binary and 0.0999755859375 in decimal.
      
      That's why the result becomes slightly less than 0.1
      0.0999755859375 < 0.1
    • Trong dấu phẩy động có độ chính xác kép sử dụng 53 bit, xấp xỉ dấu phẩy động bằng 0. 1 có thể lớn hơn 0. 1____5

Do tất cả điều này, dấu thập phân có thể không cho kết quả dấu phẩy động chính xác như

  • Trong toán học thuần túy, mọi số thập phân đều có một nhị phân tương đương (số thập phân được chuyển đổi thành nhị phân)
  • Trong toán học dấu phẩy động, điều này có thể đơn giản là không đúng và chúng tôi không nhận được giá trị chính xác cho mọi số thập phân.
    Lưu ý. Trong hầu hết các máy tính, chúng ta thấy 0. 1 + 0. 2 = 0. 3 mặc dù thực tế đó cũng là một thiết bị máy tính. Lời giải thích là nó sử dụng các chữ số bảo vệ bổ sung để khắc phục nhược điểm này bằng cách làm tròn một vài bit cuối cùng.
Tài liệu tham khảo .

Dưới đây là một số liên kết hữu ích mà bạn có thể tham khảo để có thêm kiến ​​thức về số học dấu phẩy động trong máy tính

  • https. //0. 30000000000000004. com
  • https. // stackoverflow. com/a/28679423/1651334
  • https. //www. khám phá nhị phân. com/why-0-point-1-does-not-exist-in-floating-point
  • https. //www. quora. com/Tại sao-là-0-1+0-2-không-bằng-0-3-trong-ngôn-ngữ-lập-trình-nhất
  • https. //www. khám phá nhị phân. com/floating-point-questions-are-endless-on-stackoverflow-com
  • https. // stackoverflow. com/câu hỏi/588004/is-floating-point-math-broken/27030789#27030789
  • https. // tài liệu. tiên tri. com/cd/E19957-01/806-3568/ncg_goldberg. html

 

Tôi hy vọng điều này có thể giải đáp một số thắc mắc của bạn về lý do tại sao máy tính không trả về kết quả như mong đợi khi chúng tôi thực hiện phép toán với các số thập phân

Ngoài ra, tôi tin rằng bây giờ bạn sẽ ở một vị trí tốt hơn để trả lời lại nếu ai đó hỏi bạn tại sao 0. 1 + 0. 2 không bằng 0. 3?

Tại sao là 0. 1 0. 2 không bằng 0. 3 trong JS?

0. 1 + 0. 2. này bằng 0. 3, nhưng ở dạng dấu phẩy động. (0. 1 + 0. 2) == 0. 3 là sai. Điều này là do 0. 1, 0. 2 và 0. 3 không thể được biểu diễn chính xác trong dấu phẩy động cơ số 2 .

đầu ra của 0 là gì. 1 0. 2 trong JavaScript?

Tôi vô cùng ngạc nhiên khi biết rằng 0. 1 + 0. 2 thực sự được cho là bằng 0. 30000000000000004 trong JavaScript vì phép toán dấu phẩy động. Đây có vẻ như là một lỗi đang chờ xảy ra nhưng không có cách giải quyết rõ ràng vì đặc tả ECMAScript yêu cầu rằng 0. 1 + 0. 2 ≠ 0. 3 .