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.
Bài liên quan
Rõ ràng là ĐÚNG.
Nhưng với title và code của bạn thì không thể kết luận
khi bạn mới thử so sánh float với int.
Xét riêng trường hợp của bạn thì 34567898.0 là double chứ có phải float đâu.
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
float
vàint
cũng vậyNếu ép kiểu thành
int
, ta có phép so sánh 2 và 2Nếu ép kiểu thành
float
, ta có phép so sánh 2.0 và 2.5Việ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ặcif (a == (float)b)
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]
8 chữ số. Nói đúng hơn là có 8 chữ số ở phần nguyên.
Không phải.
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.
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”.
Em cảm ơn ạ…