Em không lấy được chính xác phần lẻ của số thực được đâu. Về bản chất float
và double
không có độ chính xác không cao. Phần lẻ không đực thể hiện dưới dạng “số” mà thực ra là “số mũ”. Tức thay vì lưu toàn bộ một số xuống bộ nhớ như kiểu int
, kiểu double
sẽ lưu dữ liệu ở dạng “số mũ”.
Ví dụ đây là cách lưu số 1/3
Given the hexadecimal representation 3FD5 5555 5555 555516,
Sign = 0
Exponent = 3FD16 = 1021
Exponent Bias = 1023 (constant value; see above)
Significand = 5 5555 5555 555516
Value = 2(Exponent − Exponent Bias) × 1.Significand – Note the Significand must not be converted to decimal here
= 2−2 × (15 5555 5555 555516 × 2−52)
= 2−54 × 15 5555 5555 555516
= 0.333333333333333314829616256247390992939472198486328125
≈ 1/3
Xem thêm: http://en.wikipedia.org/wiki/Double-precision_floating-point_format
Double chỉ có thể đúng “tàm tạm” mà thôi. Nếu em muốn so sánh với 0.4
thì ta có thể làm như sau
cout << (fractional == 0.4) << endl;
Tương đương với
cout << (abs(fractional - 0.4) <= 0.0000001) << endl;
Với abs
là hàm tính giá trị tuyệt đối của phép trừ (fractional - 0.4)
. Nếu giá trị này bé hơn hoặc bằng 0.0000001
thì coi như fractional
và 0.4
là bằng nhau.
P/S: Nhớ #include <cmath>