程序里为什么1==1.0返回true?

在比较基本类型的值的时候,实际上比较的是这个数转化为二进制后的值。十进制的数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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值