在比较基本类型的值的时候,实际上比较的是这个数转化为二进制后的值。十进制的数1.0、1.5、1.25等是整数或小数最后一位是5的,是可以准确用二进制数表示的,比如1.0或1用二进制表示出来都是1.0、1.5用二进制表示是1.1、1.25用二进制表示是1.01。
那么除了整数和最后一位是5的小数,其他小数呢?其他小数就是不能完整表示出来的了,比如0.1用二进制表示为0.00011001100110011…后面是0011的无限循环。
所以为什么1.1 = = (float)1.1 返回false呢,因为1.1是double类型,(float)1.1是float类型,double类型的精度为52位,对于0.1这样的无限循环就采取了截断,只写52位,float只写23位。所以他们就不相等了。比如0.00110011和0.00110是不相等的、0.0000和0.00是相等的。
摘自:https://blog.csdn.net/qq_15756781/article/details/112916405
下面用一段C++来验证
#include <iostream>
// 将十进制小数转换为二进制小数
template<typename T>
void decimalToBinary(T num) {
// 处理整数部分
int intPart = (int)num;
// 处理小数部分
T fractionalPart = num - intPart;
std::cout << "Binary representation of " << num << " is: " << intPart << ".";
while (fractionalPart > 0) {
fractionalPart *= 2;
int bit = (int)fractionalPart;
// 输出当前位
std::cout << bit;
// 更新小数部分
fractionalPart -= bit;
}
std::cout << std::endl;
}
int main() {
//对于整数,可以精确转换为二进制
decimalToBinary((int)2);
decimalToBinary((float)2.0);
decimalToBinary((double)2.0);
printf("\n");
//对于1位小数,并且小数是5,可以精确转换为二进制
decimalToBinary((float)2.5);
decimalToBinary((double)2.5);
printf("\n");
//对于2位小数,2.25可以精确转换,其他类似2.35,2.45,2.55都不行。所以2位小数以上的基本不用考虑等于问题。
decimalToBinary((float)2.25);
decimalToBinary((double)2.25);
decimalToBinary((float)2.35);
decimalToBinary((double)2.35);
decimalToBinary((float)2.45);
decimalToBinary((double)2.45);
decimalToBinary((float)2.55);
decimalToBinary((double)2.55);
printf("\n");
//其他小数,都无法精确转换
decimalToBinary((float)0.1);
decimalToBinary((double)0.1);
return 0;
}