Có thể làm phép so sánh giữa 2 biến khác kiểu dữ liệu không?

Em có đoạn code như sau

#include <stdio.h>

void main(){
	float fVar = 34567898.0;

	printf("so sanh float vs float: ");
	if (fVar == 34567898.0){
		printf("true\n");
	}else{
		printf("false\n");
	}

	printf("so sanh float vs int: ");
	if (fVar == 34567898){
		printf("true\n");
	}else{
		printf("false\n");
	}
}

Kết quả

Vậy có phải là không thể so sánh giữa hai kiểu dữ liệu khác nhau hay không?
Nếu vậy thì nguyên nhân không thể so sánh là do đâu ạ. Em cảm ơn.

Rõ ràng là ĐÚNG.

3 == "function" // -> lỗi

Nhưng với title và code của bạn thì không thể kết luận

Có thể làm phép so sánh giữa 2 kiểu dữ liệu khác nhau

khi bạn mới thử so sánh float với int.

1 Like

Xét riêng trường hợp của bạn thì 34567898.0 là double chứ có phải float đâu.

1 Like

Hoàn toàn có thể so sánh 2 biến khác kiểu dữ liệu, tuy nhiên kết quả thế nào, chưa chắc bạn đã kiểm soát được, có thể rất khác so với dự kiến.

Về mặt nhận thức, con người cũng không thể so sánh 2 biến khác kiểu. Phải luôn luôn đưa nó về cùng một dạng so sánh, trong lập trình gọi là “ép kiểu dữ liệu”.

Ví dụ như so sánh 2 và 2.5, thực ra bạn đang so sánh độ lớn của chúng nó. Cả 2 và 2.5 đều bị ép kiểu vào “trục số tưởng tượng” trong não, từ đó cho kết luận 2.5 > 2

floatint cũng vậy

Nếu ép kiểu thành int, ta có phép so sánh 2 và 2
Nếu ép kiểu thành float, ta có phép so sánh 2.0 và 2.5
Việc ép kiểu tự động thế nào phụ thuộc vào nhiều thứ, giải thích lằng nhằng, bạn cứ làm nhiều sẽ quen. Còn nếu không muốn để máy tự động, bạn có thể sử dụng toán tử hoặc hàm ép kiểu dữ liệu, phổ biến nhất là cast if (a == (int)b) hoặc if (a == (float)b)

1 Like

có phải do 34567898.0 có 8 số nên tự chuyển thành double tại đây phải không ạ

8 chữ số. Nói đúng hơn là có 8 chữ số ở phần nguyên.

Không phải.

Khi gán

thì in fVar ra có giá trị 334567896.0. Nhưng tại sao so sánh với 34567898 tại

thì kết quả trả về lại là true.

Thừa 1 con 3 rồi.

Tốt nhất nên để double.

Không biết vấn đề này thuộc lĩnh vực nào để gg nhỉ, tại em cần phải biết lí do nó tra true.
Nếu so sánh giữa biến kiểu float và int, compiler có ép kiểu int về float rồi so sánh không ạ.

Viết để không như vậy thì là double, muốn float thì phải có f đằng sau số nữa.

Có đấy bạn. Đây gọi là “type promotion”.

2 Likes

Em cảm ơn ạ…

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?