Toán học trong C# (phần 19)

Lỗi tràn bộ đệm và làm tròn (tiếp tục)

Thực hiện một chuyển đổi hẹp với một cast là một cách thức nhanh để gây ra tràn bộ đệm, nên cast khôn
ngoan.
Với các dạng dấu phẩy động, hành vi là hơi khác một chút. Vì tất cả các dạng dấu phẩy động có một cách để
trình bày vô hạn, nếu bạn đi quá xa lên hay xuống, số sẽ chuyển thành trình bày vô hạn dương hay âm của
dạng. Toán học với các vô hạn sẽ dẫn đến kết quả nhiều vô hạn hơn (hay NaNs), nên mặc dù hành vi là hơi khác
so với các dạng số nguyên, kết quả có ý nghĩa đáng kể.
Các dạng dấu phẩy động có một hạng mục thứ hai vấn đề gọi là lỗi làm tròn. Số 10000 có thể được trình bày đúng
đắn với một float, như có thể 0.00001. Trong thế giới toán học, bạn có thể an toàn cộng hai giá trị đó cùng với
nhau để nhận 10000.00001. Nhưng một float không thể. Nó chỉ có 6 hay 7 con số chính xác và không thể phân biệt
10000 với 10000.00001.

float a = 10000;
float b = 0.00001f;
float sum = a + b;

Kết quả được làm tròn thành 10000, và sum vẫn sẽ là 10000 sau phép cộng. Lỗi làm tròn thường không là vấn đề lớn,
nhưng thỉnh thoảng, các con số bị mất tích luỹ, như khi cộng cột lớn các số nhỏ. Bạn có thể đôi khi gạt sang bên cái
này bằng cách sử dụng một dạng chính xác hơn. Ví dụ, cả double và decimal không có vấn đề với tình huống cụ thể này.
Nhưng tất cả 3 cái có nó cuối cùng tại các quy mô khác nhau.

Chia sẻ