01/10/2018, 12:07

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
");
	}else{
		printf("false
");
	}

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

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.

HK boy viết 14:24 ngày 01/10/2018

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?

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.

rogp10 viết 14:12 ngày 01/10/2018

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

Trần Hoàn viết 14:09 ngày 01/10/2018

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)

Huynh Tan Thanh viết 14:10 ngày 01/10/2018

có phải do 34567898.0 có 8 số nên tự chuyển thành double tại đây phải không ạ[quote=“d3c0d3d, post:1, topic:56831”]
if (fVar == 34567898.0)
[/quote]

HK boy viết 14:16 ngày 01/10/2018

8 số

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

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

Không phải.

Huynh Tan Thanh viết 14:19 ngày 01/10/2018

Khi gán[quote=“d3c0d3d, post:1, topic:56831”]
float fVar = 34567898.0;
[/quote]
thì in fVar ra có giá trị 334567896.0. Nhưng tại sao so sánh với 34567898 tại [quote=“d3c0d3d, post:1, topic:56831”]
if (fVar == 34567898)
[/quote]

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

HK boy viết 14:15 ngày 01/10/2018

334567896.0

Thừa 1 con 3 rồi.

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

Huynh Tan Thanh viết 14:20 ngày 01/10/2018

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 ạ.

rogp10 viết 14:23 ngày 01/10/2018

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

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 ạ.

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

Huynh Tan Thanh viết 14:15 ngày 01/10/2018

Em cảm ơn ạ…

Bài liên quan
0