Tại sao lại không so sánh kiểu số thực được? Vấn đề này Dr đã nêu ra một lần, với một bài viết rất chi tiết nhưng không rõ là nó nằm ở đâu nữa. Chán
Hãy xem một chút các chú thích mà Dr đưa ra sau đây.
float a=2.1; //2.1 ở đây được gán kiểu float
if(a==2.1) //2.1 ở đây là một hằng kiểu decimal
Trong máy tính, nó hoàn toàn không hiểu được số 2.1 như bạn. Mà nó phải chuyển sang số nhị phân. Khi chuyển sang số nhị phân thì cái phần dấu chấm động sẽ chuyển sang dạng sau:
Code:
0.1 x 2 = 0.2 => 0.0
0.2 x 2 = 0.4 => 0.00
0.4 x 2 = 0.8 => 0.000
0.8 x 2 = 1.6 => 0.0001 (1.6 -1 = 0.6)
0.6 x 2 = 1.2 => 0.00011 (1.2 -1 = 0.2)
0.2 x 2 = 0.4 => 0.000110 (Quay lại dòng thứ 2)
0.4 x 2 = 0.8 => 0.0001100
Như vậy với số 2.1 khi chuyển sang nhị phân sẽ là một số dạng vô hạn tuần hoàn. Kiểu float và decimal có độ dài dấu chấm động khác nhau, nên nó sẽ là 2 số khác nhau. Kết quả sai là máy tính làm đúng đó.
Như vậy bạn đã hiểu tại sao lại không thể so sánh được rồi chứ? Với các số có dạng: x.0, x.5, x.25, thì có thể so sánh trực tiếp như của bạn được đấy.
Bạn thử với code sau xem:
#include<stdio.h>
void main()
{
float a=2.1;
float b=2.1;
if(a==b)
else
getch();
}
Best regards!