web-dev-qa-db-fra.com

Cast flottant C ++ int

Pourquoi m est toujours = 0? Les membres x et y de someClass sont des entiers.

float getSlope(someClass a, someClass b)
{           
    float m = (a.y - b.y) / (a.x - b.x);
    cout << " m = " << m << "\n";
    return m;
}
25
el_pup_le

La division entière se produit, puis le résultat, qui est un entier, est affecté comme un flottant. Si le résultat est inférieur à 1, il se termine par 0.

Vous voudrez convertir les expressions en flottants avant de les diviser, par exemple.

float m = (float)(a.y - b.y) / (float)(a.x - b.x);
43
BoltClock

Vous devez utiliser la fonte. Je vois les autres réponses, et elles fonctionneront vraiment, mais comme la balise est C++ Je vous suggère d'utiliser static_cast :

float m = static_cast< float >( a.y - b.y ) / static_cast< float >( a.x - b.x );
55
Kiril Kirov

Vous devez savoir que lors de l'évaluation d'une expression contenant des nombres entiers, les résultats temporaires de chaque étape de l'évaluation sont également arrondis pour être des nombres entiers. Dans votre affectation à float m, La valeur n'est convertie en type float capable de nombre réel qu'après l'arithmétique entière. Cela signifie que, par exemple, 3/4 serait déjà une valeur "0" avant de devenir 0,0. Vous devez forcer la conversion à flotter pour qu'elle se produise plus tôt. Pour ce faire, utilisez la syntaxe float(value) sur l'un des a.y, b.y, a.x, b.x, a.y - b.y, ou a.x - b.x: peu importe quand c'est fait tant qu'un des termes est un flottant avant que la division ne se produise, par exemple.

float m = float(a.y - b.y) / (a.x - b.x); 
float m = (float(a.y) - b.y) / (a.x - b.x); 
...etc...
1
Tony Delroy

il fait une division entière, ce qui signifie 3/4 = 0. lancer une des parenthèses pour flotter

 (float)(a.y - b.y) / (a.x - b.x);
0
Ronny Brendel

Vous effectuez des calculs sur des entiers et affectez son résultat à float. Donc, le compilateur convertit implicitement votre résultat entier en float

0
Vineet G

si (a.y - b.y) est inférieur à (a.x - b.x), m est toujours nul.

alors jetez-le comme ça.

float m = ((float)(a.y - b.y)) / ((float)(a.x - b.x));
0
Prince John Wesley

Parce que (a.y - b.y) est probablement inférieur à (a.x - b.x) et dans votre code, le transtypage est effectué après l'opération de division, le résultat est donc un entier donc 0.

Vous devez lancer pour flotter avant l'opération /

0
Dumitrescu Bogdan