NỘI DUNG BÀI VIẾT
Gần đây, mình đã gặp một vấn đề kỳ lạ khi lập trình, đó là JavaScript parseInt(0,0000005) === 5 😱. Thông thường, đầu ra bằng 0 mới đúng, nhưng tại sao lại là 5? Chúng ta hãy cùng nhau khám phá vấn đề này nhé!
Tại sao JavaScript parseInt(0.0000005) in ra 5?
Khi nào sử dụng JavaScript parseInt()?
Trước hết, bạn thường sử dụng parseInt() khi nào? Hầu hết, chúng ta sử dụng nó để ép kiểu String sang kiểu Number hoặc trả về phần nguyên của nó.
Vài điều về JavaScript parseInt()
Hàm parseInt(string, radix) nhận đầu vào là một chuỗi và trả về một số nguyên của cơ số được chỉ định (cơ số trong hệ thống số toán học).
Cú pháp:
parseInt(string)
parseInt(string, radix)
Code language: JavaScript (javascript)
Ví dụ:
parseInt('0.5') // 0
parseInt('0.5') // 0
parseInt('0.05') // 0
parseInt('0.005') // 0
parseInt('0.0005') // 0
parseInt('0.00005') // 0
parseInt('0.000005') // 0
parseInt('015') // 15
parseInt('015', 8) // 13
parseInt('15px', 10) // 15
Code language: JavaScript (javascript)
ParseInt ép kiểu như thế nào?
Khi tham số đầu tiên của parseInt() là một số, nó sẽ phân tích như thế nào?
Sự thật của parseInt(0,0000005) === 5 cũng ở đây …
Xem thêm: Ép kiểu trong JavaScript
Bước 1: Ép kiểu Number thành String
Cùng xem qua các giá trị của nó dưới đây nhé:
String(0.5); // => '0.5'
String(0.05); // => '0.05'
String(0.005); // => '0.005'
String(0.0005); // => '0.0005'
String(0.00005); // => '0.00005'
String(0.000005); // => '0.000005'
String(0.0000005); // => '5e-7' ????? ủa
Code language: JavaScript (javascript)
Bước 2: Thực hiện phép toán làm tròn số
Vì vậy, có nghĩa là khi chúng ta sử dụng parseInt(0,0000005), nó bằng với parseInt(‘5e-7’) và dựa trên định nghĩa:
parseInt() chỉ có thể thông dịch một phần đầu của chuỗi dưới dạng giá trị số nguyên, nó sẽ bỏ qua bất kỳ đơn vị nào mà không thể thông dịch
parseInt(0.0000005)
parseInt('5e-7') // 5
Code language: JavaScript (javascript)
Cuối cùng, câu trả lời sẽ chỉ trả về 5 vì nó là ký tự duy nhất là một số cho đến một ký tự không phải e, vì vậy phần còn lại của nó là e-7 sẽ bị loại bỏ.
Cách lấy phần nguyên của số có dấu phẩy động một cách an toàn
Chúng ta nên sử dụng hàm Math.floor() thay cho việc này nhé:
Math.floor(0.5); // => 0
Math.floor(0.05); // => 0
Math.floor(0.005); // => 0
Math.floor(0.0005); // => 0
Math.floor(0.00005); // => 0
Math.floor(0.000005); // => 0
Math.floor(0.0000005); // => 0
Code language: JavaScript (javascript)
Tự học bằng cách nội suy
Qua ví dụ vừa rồi, bạn đã hiểu “Tại sao JavaScript parseInt(0.0000005) in ra 5?” chưa? Mình lại có thêm ví dụ nữa cho bạn. Tuy nhiên, câu hỏi này sẽ là bạn trả lời:
Bạn hãy giải thích tại sao parseInt(99999999999999999999999999) bằng 1 😱
Dễ hay khó nhỉ, hãy để lại bình luận ở phần comment phía dưới nhé!
Cảm ơn bạn đã theo dõi bài viết!
Các bạn có thể tham khảo các bài viết hay về JavaScript tại đây.
Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.
TỔNG HỢP TÀI LIỆU HỌC LẬP TRÌNH CƠ BẢN CHO NGƯỜI MỚI BẮT ĐẦU
KHOÁ HỌC BOOTCAMP JAVA/JAVASCRIPT/PHP TRỞ THÀNH LẬP TRÌNH VIÊN TRONG 5-6 THÁNG