Sự khác biệt giữa hai phương pháp nằm trong cách trình biên dịch tối ưu hóa các hoạt động điểm động. Hãy để tôi giải thích.
string value = "0.01";
float convertedValue = float.Parse(value);
return (int)(convertedValue * 100.0f);
Trong ví dụ này, giá trị được phân tích thành số dấu phẩy động 80 bit để sử dụng trong các dấu phẩy động bên trong của máy tính. Sau đó, điều này được chuyển thành phao 32 bit để lưu trữ trong biến số convertedValue
. Điều này làm cho giá trị được làm tròn đến, dường như, một số hơi nhỏ hơn 0,01. Sau đó, nó được chuyển đổi trở lại một phao 80-bit và nhân với 100, làm tăng lỗi làm tròn gấp 100 lần. Sau đó, nó được chuyển đổi thành int 32 bit. Điều này làm cho phao được rút ngắn, và vì nó thực sự là hơi nhỏ hơn 1, việc chuyển đổi int trả về 0.
string value = "0.01";
float convertedValue = float.Parse(value) * 100.0f;
return (int)(convertedValue);
Trong ví dụ này, giá trị được phân tách thành một 80-bit số dấu chấm động một lần nữa. Sau đó nó được nhân với 100, trước khi nó được chuyển thành phao 32 bit.Điều này có nghĩa là lỗi làm tròn quá nhỏ đến nỗi khi nó được chuyển thành phao 32 bit để lưu trữ trong convertedValue
, nó tròn thành chính xác 1. Khi nó được chuyển thành một int, bạn nhận được 1.
ý tưởng là máy tính sử dụng các phao nổi chính xác cao để tính toán và sau đó làm tròn các giá trị bất cứ khi nào chúng được lưu trữ trong một biến. Bạn càng có nhiều bài tập với phao, càng có nhiều lỗi làm tròn.
Nguồn
2012-03-14 23:14:07
Bạn đang sử dụng phiên bản C# nào? Tôi không thể tái tạo điều này. Tôi nghi ngờ nó có lẽ không xảy ra như bạn mô tả, bởi vì thực sự hai hoạt động đó sẽ trả về cùng một kết quả. –
Đó là trong mã cho một trang web asp.net. Tôi tin rằng nó được cấu hình để chạy .net 4 nhưng không chắc chắn. – Mark1270287
Tôi đánh giá cao tất cả các câu trả lời. Tôi muốn tôi có thể ghi nhận một số trong số họ. – Mark1270287