Qt 浮点数比较大小

在Qt的IDE中如果直接使用==对浮点数做比较,总是出现警告,好烦,最后在网上查了查,原来可以这样。

    double value1 = 3.1415926;
    double value2 = 3.1415927;

    if(qFuzzyCompare(value1,value2)) {
        qDebug()<<" == ";
    }
    else {
        qDebug()<<" != ";
    }

是不是很哇塞~~

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Qt Modbus TCP中,读取一个四字节点数,需要将其分为两个16位的寄存器。读取到的数据默认是大端字节序,需要进行大小端转换后,再将其转换为10进制点数。 以下是一个示例代码,可以读取一个四字节点数: ```cpp QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters, startAddress, 2); if (auto *reply = modbusDevice->sendReadRequest(readUnit, serverAddress)) { if (!reply->isFinished()) connect(reply, &QModbusReply::finished, this, &MyClass::onReadReady); else delete reply; // broadcast replies return immediately } else { qDebug() << "Read error: " << modbusDevice->errorString(); } ... void MyClass::onReadReady() { auto reply = qobject_cast<QModbusReply *>(sender()); if (!reply) return; if (reply->error() == QModbusDevice::NoError) { const QModbusDataUnit unit = reply->result(); // 将读取到的数据按照两个16位的寄存器进行拼接 quint16 msb = unit.value(0); quint16 lsb = unit.value(1); quint32 value = (msb << 16) + lsb; // 进行大小端转换 if (QSysInfo::ByteOrder == QSysInfo::BigEndian) { value = qbswap(value); } // 将四字节点数转换为10进制点数 float floatValue; memcpy(&floatValue, &value, sizeof(floatValue)); qDebug() << "Float value: " << floatValue; } else if (reply->error() == QModbusDevice::ProtocolError) { qDebug() << "Read response error: " << reply->errorString(); } else { qDebug() << "Read error: " << reply->errorString(); } reply->deleteLater(); } ``` 在上面的代码中,`startAddress` 表示要读取的寄存器地址,`serverAddress` 表示Modbus从站的地址。在读取到数据后,首先将两个16位的寄存器拼接成一个32位的值,并进行大小端转换。然后使用 `memcpy` 将四字节点数转换为10进制点数,最后将其输出到控制台。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃馒头爱吃鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值