0.1 + 0.2 → 0.30000000000000004: JS chỉ có một kiểu số — IEEE 754 double (64-bit floating point). Các phân số như 0.1, 0.2 không biểu diễn chính xác ở hệ nhị phân (giống 1/3 không hết ở hệ thập phân), nên phép cộng tích lũy sai số nhỏ. Đây là đặc tính của mọi ngôn ngữ dùng float, không riêng JS.
Cách so sánh số thực an toàn: kiểm tra sai lệch nhỏ hơn một ngưỡng (epsilon):
Math.abs(0.1 + 0.2 - 0.3) < Number.EPSILON // trueVới tiền tệ: tính bằng đơn vị nhỏ nhất (cent/đồng, số nguyên) hoặc dùng thư viện decimal.
NaN (Not-a-Number): kết quả của phép toán số không hợp lệ (0/0, parseInt('abc'), Math.sqrt(-1)). Đặc điểm lạ: NaN không bằng chính nó — NaN === NaN → false. Vì vậy:
- Kiểm tra bằng Number.isNaN(x) (chuẩn, không ép kiểu) — đừng dùng global isNaN() cũ vì nó ép kiểu trước (isNaN('abc') → true gây hiểu nhầm).
- Hoặc mẹo x !== x chỉ đúng khi x là NaN.