Chi tiết bài học 18. Sử dụng các biến số chính xác trong Javascript

18. Sử dụng các biến số chính xác trong Javascript

Kỹ thuật áp dụng Javascript hiệu quả – Sử dụng các biến số chính xác trong Javascript

JavaScript sử dụng các giá trị dấu chấm động để xử lý tất cả các thao tác tính toán thập phân. Điều này nhằm tăng hiệu năng tính toán, tuy nhiên đôi lúc sẽ đánh đổi bằng sự chính xác. Ta hãy cùng xem ví dụ sau:

console.log(0.1+0.2);

Ở đây chúng ta kỳ vọng kết quả trả về là 0.3. Tuy nhiên kết quả thực sự trả về là 0.30000000000000004.

Hay:

console.log(0.1+0.2+0.3);

Dĩ nhiên theo suy nghĩ thông thường kết quả trả về sẽ là 0.6. Nhưng kết quả thực sự mà ta nhận được là 0.6000000000000001.

Không chịu thua, chúng ta sẽ thử tìm cách xoay sở. Thử thêm dấu ngoặc vào xem nào, xem có thay đổi gì tích cực hơn không.

console.log((0.1+0.2)+0.3);

→ 0.6000000000000001;

Kết quả vẫn như cũ. Thế nhưng, nếu ta thay đổi vị trí cặp ngoặc () một chút, thì ta sẽ thấy:

console.log(0.1+(0.2+0.3));

→ 0.6;

Thật lạ lùng, đúng không nào. Rõ ràng ở đây, ta phải tìm cách kiểm soát để Javascript trả về giá trị chính xác cho các phép tính thập phân.

Đầu tiên, phương thức toFixed() sẽ cho phép bạn lựa chọn chính xác số chữ số thập phân cần hiển thị.

var so = 0.1+0.2;
console.log(so.toFixed(1));

→ 0.3;

Ở đây ta nhận ra một điều, là phương thức toFixed() sẽ làm tròn phép tính cho ta đến số chữ số thập phân mà ta truyền vào.

Ví dụ, ta viết một hàm tính tiền thuế của một sản phẩm như sau:

function thue(gia, phantram) {
    return (gia*phantram/100).toFixed(2);
}

Ta sẽ chạy hàm thuế với 2 giá trị như sau:

thue(102.45, 10) 

102.45*10/100 = 10.245 → 10.25: Do chúng ta làm tròn đến 2 chữ số thập phân.

Tuy nhiên, quan sát kết quả trả về ta sẽ thấy nó ở dạng String “10.25”. Lạ nhỉ, vì ta đang để ở dạng số mà. Và điều này sẽ rất nguy hiểm, nếu ta cần tính tổng tiền của sản phẩm sau thuế, như sau:

var gia = 102.45;
var phantram = 10;
var tongtien = gia + thue(gia, phantram);
console.log(tongtien);

Kết quả trả về sẽ là một phép cộng chuỗi “102.4510.25”, một kết quả vô nghĩa. Vậy làm cách nào để chúng ta khắc phục lỗi này? Ta sẽ sử dụng thêm một hàm để chuyển chuỗi thành số thực, đó là hàm parseFloat.

function thue(gia, phantram) {
    return parseFloat((gia*phantram/100).toFixed(2));
}
var gia = 102.45;
var phantram = 10;
var tongtien = gia + thue(gia, phantram);
console.log(tongtien);

→ 112.70;

Tương tự với hàm parseFloat(), ta có hàm parseInt() dùng để chuyển một chuỗi thành số nguyên.

parseInt("100");

→ 100;

Tuy nhiên, sẽ có những trường hợp việc sử dụng hàm parseInt khá nguy hiểm, ví dụ như sau:

parseInt("100 phan tram");

→ 100;

Hoặc:

parseInt("Thue gia tri gia tang la 10 phan tram");

→ NaN; (Not a Number: không phải giá trị số)

Một lưu ý nhỏ sau cùng, là hàm parseInt() không dùng để làm tròn, ta có thể thấy rõ trong trường hợp sau:

parseInt(9.99);

→ 9;

Hàm parseInt() chỉ tìm cách cắt lấy giá trị số trước dấu chấm thập phân, chứ nó hoàn toàn không áp dụng khái niệm làm tròn cho giá trị số mà chúng ta áp dụng hàm parseInt(), nên hãy cẩn thận, đừng áp dụng sai lầm.

 

Kết luận

Qua bài này chúng ta đã cùng tìm hiểu và nắm vững cách xử lý con số trong lập trình Javascript. Đến đây, bạn đã nắm vững tất cả các khái niệm nâng cao cần thiết trong ngôn ngữ lập trình Javascript cũng như kỹ thuật áp dụng Javascript sao cho hiệu quả nhất khi lập trình. Mến chúc các bạn thành công.