C 圆形(49.5)返回49次使用变量(以QT为单位)

C++ round(49.5) returns 49 when called with variable (in Qt)

本文关键字:变量 QT 为单位 返回 圆形 49次      更新时间:2023-10-16

我写了以下代码:

void InputNodeInstance::changeSize(QString side, float mult) {
    qDebug() << "width: " << width;
    double widthMultiplied = width * mult;
    qDebug() << "width * mult: " << width * mult;
    qDebug() << "widthMultiplied: " << widthMultiplied;
    qDebug() << "round(widthMultiplied): " << round(widthMultiplied);
    qDebug() << "round(49.5): " << round(49.5);
    width = width * mult + 0.5;
    qDebug() << "width: " << width;
}

,当我以0.9为mult调用该函数时,我将获得此输出:

width:  55
width * mult:  49.5
widthMultiplied:  49.5
round(widthMultiplied):  49
round(49.5):  50
width:  49

我猜这个问题很清楚。
widthMultiplied 49.5
round(49.5)返回 50
round(widthMultiplied)返回 49

为什么?

由于浮点数计算的不准确而发生的。这里和这里的更多信息。

width * mult乘法的结果不是精确的49.5,而是49.4999999,这是将您的数字四舍五入到49而不是50的原因。通过为qDebug输出设置更高的精度:

,请尝试一下。
qDebug() << qSetRealNumberPrecision(20) << widthMultiplied;

阅读Kefir的答案以获取背景信息。我认为一个完整的工作解决方案(虽然您对数字不太遥远)可能是:

int number = 55;
double mult = 0.9;
double roundedNumber = round( static_cast<double>( static_cast<int>( number * mult * 100. ) ) / 100 );