double/float theo chuẩn IEEE 754 nhị phân.
Số 0.1 và 0.2 là phân số tuần hoàn trong hệ nhị phân nên chỉ được lưu xấp xỉ; cộng lại ra 0.30000000000000004.
java
System.out.println(0.1 + 0.2); // 0.30000000000000004
System.out.println(0.1 + 0.2 == 0.3); // falseVới tiền, dùng một trong hai cách:
1. BigDecimal khởi tạo bằng chuỗi, không bằng double:
java
new BigDecimal("0.1").add(new BigDecimal("0.2")); // 0.3
new BigDecimal(0.1); // 0.1000000000000000055511151231257827...2. Số nguyên đơn vị nhỏ nhất (long lưu VND, hoặc cent) — nhanh và không có sai số.
Hai lưu ý khi dùng BigDecimal:
- equals() so cả scale: new BigDecimal("2.0").equals(new BigDecimal("2.00")) là false. So sánh giá trị phải dùng compareTo(...) == 0.
- Phép chia không chia hết ném ArithmeticException nếu không truyền RoundingMode — luôn chỉ định setScale(2, RoundingMode.HALF_UP) hoặc tương đương.