Giá trị hiển thị đúng hai chữ số thập phân nhưng phép cộng tiếp theo cho kết quả lạ. toFixed trả về chuỗi. Nếu dùng kết quả định dạng như dữ liệu tính toán, ứng dụng có thể nối văn bản thay vì cộng số.
1. toFixed làm thay đổi kiểu đầu ra
const value = 2.5;
const label = value.toFixed(2);
console.log(label); // 2.50
console.log(typeof label); // string
console.log(label + 1); // 2.501
console.log(value + 1); // 3.5
label là chuỗi '2.50', nên phép + với 1 trong ví dụ thực hiện nối chuỗi. Theo MDN Number.toFixed, phương thức trả biểu diễn chuỗi với số chữ số thập phân yêu cầu, có làm tròn hoặc thêm số 0 khi cần.
Đặt tên biến value và label giúp thể hiện hai vai trò. Nếu cùng một biến được gán lại từ Number sang chuỗi giữa luồng xử lý, phần mã phía sau khó biết nó còn có thể dùng cho phép tính nào.
2. Chuyển lại Number không giữ thông tin trình bày
const label = (2.5).toFixed(2);
const parsed = Number(label);
console.log(parsed); // 2.5
console.log(parsed + 1); // 3.5
console.log(JSON.stringify({ value: parsed, label }));
// {"value":2.5,"label":"2.50"}
Ví dụ cho thấy '2.50' và số 2.5 mang thông tin khác nhau: chuỗi lưu cả cách viết, còn Number không lưu yêu cầu phải hiện hai chữ số sau dấu chấm. Nếu API cần kiểu số, đừng đổi field thành chuỗi chỉ để cố giữ số 0 cuối.
Trường hợp thật có thể chỉ cần gửi value và định dạng tại giao diện. Nếu phải gửi cả nhãn, đặt tên và kiểu riêng trong contract. Không tự dùng nhãn đã làm tròn làm nguồn cho tính toán tiếp nếu nghiệp vụ cần giá trị ban đầu.
3. Chuỗi định dạng không tự chứng minh đầu vào hợp lệ
console.log(NaN.toFixed(2)); // NaN
console.log(Infinity.toFixed(2)); // Infinity
console.log((1e21).toFixed(2)); // 1e+21
Ba kết quả trên đều là chuỗi. Một lời gọi toFixed không lỗi chưa bảo đảm đó là số đo hữu hạn hoặc nhãn dạng cố định như giao diện mong muốn. MDN cũng nêu việc dùng ký pháp mũ khi trị tuyệt đối đạt từ 10^21 trở lên.
Đừng dùng độ dài chuỗi hoặc sự tồn tại của dấu chấm làm bộ xác thực số. Kiểm tra đầu vào theo kiểu, miền giá trị và số chữ số được phép trước khi tạo nhãn. Việc định dạng cũng không khôi phục phần chính xác đã mất từ các bước tính trước.
4. Helper chỉ định dạng dữ liệu đã qua contract
function formatMeasurement(value, digits = 2) {
if (!Number.isFinite(value)) throw new TypeError('value must be finite');
if (Math.abs(value) > 1_000_000_000) {
throw new RangeError('value is outside the supported range');
}
if (!Number.isInteger(digits) || digits < 0 || digits > 6) {
throw new RangeError('digits must be an integer from 0 to 6');
}
return value.toFixed(digits);
}
const value = 12.5;
const label = formatMeasurement(value);
console.log(label); // 12.50
console.log(value + 1); // 13.5
Giới hạn một tỷ và 0–6 chữ số thập phân là chính sách minh họa của ứng dụng, không phải toàn bộ miền hỗ trợ của toFixed. Helper từ chối chuỗi số, null, NaN và Infinity; không tự diễn giải dữ liệu form thành số.
Hàm trả chuỗi theo chủ đích và giữ value ban đầu để tính tiếp. Nếu ứng dụng cần quy tắc làm tròn chuyên biệt hoặc dữ liệu thập phân chính xác, định nghĩa kiểu và thuật toán riêng theo contract thay vì xem số chữ số hiển thị là bằng chứng độ chính xác của dữ liệu.
5. Kiểm tra kiểu dữ liệu ở ranh giới hiển thị
- Khẳng định đầu ra formatter là chuỗi trong test.
- Giữ giá trị số và nhãn hiển thị ở hai biến riêng.
- Kiểm tra field JSON đúng kiểu theo contract.
- Thử 0, số âm, NaN, Infinity và đầu vào sai kiểu.
- Không đưa nhãn đã làm tròn vào phép tính tiếp một cách vô ý.
Tám khối mã Việt–Anh đã chạy bằng Node.js, kèm kiểm tra giới hạn, kiểu đầu vào và kiểu đầu ra của helper. Chưa tích hợp API hoặc component giao diện thật.




Chưa có bình luận. Hãy là người đầu tiên chia sẻ ý kiến.