2017-09-24 5 views
0

j'ai écrit le code suivant:C++ rond (49,5) retourne 49 lorsqu'elle est appelée avec variable (dans Qt)

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; 
} 

Et quand je l'appelle la fonction avec 0,9 comme mult, je reçois cette sortie:

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

Je suppose que la question est claire.
widthMultiplied est 49,5.
round(49.5) renvoie .
round(widthMultiplied) renvoie .

Pourquoi?

Répondre

0

Lire la réponse de Kéfir pour l'information de base. Je pense une solution complète de travail (alors que vous ne pas aller trop loin avec vos chiffres) pourrait être:

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

Cela se produit en raison de l'inexactitude du calcul des nombres à virgule flottante. Plus d'infos here et here.

Le résultat de la multiplication width * mult est pas exact 49,5 mais quelque chose comme 49,4999999, qui est la raison pour arrondir votre numéro à 49, pas 50. Essayez-le youself en définissant le plus precision pour votre sortie qDebug:

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

Oui, probablement vous avez raison, j'ai aussi gardé cela à l'esprit, mais imprime le qDebug() 45,5 et pas 45.49999999. Je pense que le qDebug imprime le nombre entier – mep

+0

@mep La précision par défaut pour 'qDebug' est de 6 chiffres de fraction. La solution que vous avez publiée peut toujours échouer avec d'autres numéros en raison des raisons décrites dans les articles liés. – kefir500

+0

Mais pourquoi qDebug imprime-t-il alors 50? Il devrait imprimer 49.499999 à la place. Et s'il arrondit le nombre, comme je voulais le faire, le nombre ne peut pas être 49.499999 parce que la sortie est 50. Serait-ce une solution d'arrondir d'abord à une décimale puis d'arrondir à un nombre de 0 chiffres? – mep