2017-09-24 70 views
0

我寫了下面的代碼:C++輪(49.5)返回49

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 

我想這個問題很清楚。
widthMultiplied49.5
round(49.5)返回。
round(widthMultiplied)返回。

爲什麼?

回答

0

閱讀kefir的背景信息的答案。 我認爲一個完整的工作解決方案(雖然你不跟你數過遠)可能是:

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

這是由於浮點數計算的不準確。更多信息herehere

width * mult相乘的結果不準確49.5,但像49.4999999,這是四捨五入您的號碼49的原因,而不是50試一試youself通過設置較高precisionqDebug輸出:

qDebug() << qSetRealNumberPrecision(20) << widthMultiplied; 
+0

是的,也許你是對的,我也留了個心眼,但qDebug()45.5打印而不是45.49999999。我想,qDebug打印整個數字 – mep

+0

@mep'qDebug'的默認精度是6個小數位數。由於鏈接文章中描述的原因,您發佈的解決方案仍可能會因其他數字而失敗。 – kefir500

+0

但是爲什麼qDebug打印50呢?它應該打印49.499999。如果數字四捨五入,就像我想要的那樣,數字不能是49.499999,因爲輸出是50.它可能是一個解決方案,先四捨五入到小數點後再舍入到一個0位數? – mep