Số trong JavaScript là IEEE-754 double (nhị phân 64-bit).
Các phân số như 0.1, 0.2 không biểu diễn chính xác được ở hệ nhị phân nên bị làm tròn, cộng vào ra 0.30000000000000004.
0.1 + 0.2; // 0.30000000000000004
0.1 + 0.2 === 0.3; // false
Math.abs(0.1 + 0.2 - 0.3) < Number.EPSILON; // true — cách so sánh đúngVới tiền tệ, không dùng float. Ba cách phổ biến:
- Lưu số nguyên đơn vị nhỏ nhất: VND lưu thẳng đồng, USD lưu cents. Mọi phép cộng/trừ chạy trên Number nguyên, chỉ chia/định dạng ở tầng hiển thị.
- BigInt khi giá trị vượt Number.MAX_SAFE_INTEGER (9.007.199.254.740.991).
- Thư viện decimal (decimal.js, dinero.js) khi cần nhân/chia tỉ lệ, thuế, lãi suất.
Ở tầng DB thì dùng NUMERIC/DECIMAL, không dùng FLOAT. Định dạng hiển thị bằng Intl.NumberFormat('vi-VN', { style: 'currency', currency: 'VND' }) thay vì tự nối chuỗi.