Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Une expression de division entière a été implicitement convertie en type à virgule flottante.
La division est effectuée à l’aide d’opérations entières, ce qui a pour effet de tronquer la partie fractionnaire avant l’affectation de celle-ci au type de résultat à virgule flottante. Cette vérification n’indique pas toujours un bogue, car parfois la troncation est intentionnelle.
Dans Visual Studio 2022, la vérification lnt-integer-float-division
est contrôlée par le paramètre Résultat de division tronqué dans les options de style de code C/C++. Pour plus d’informations sur la modification de ce paramètre, consultez Configurer le linter.
Dans Visual Studio 2019, la vérification lnt-integer-float-division
est contrôlée par le paramètre Division entière convertie en type à virgule flottante dans les options de style de code C/C++. Pour plus d’informations sur la modification de ce paramètre, consultez Configurer le linter.
Exemples
float divide(int i, int j) {
return i / j; // Flagged: The integer division result is implicitly cast to float.
}
float half(int i) {
return i / 2; // Flagged: An integer literal is used.
}
Pour résoudre le problème
Le correctif suggéré par le linter consiste à caster explicitement l’un des opérandes de division en un type à virgule flottante, de façon à ce que le résultat de la division ne soit pas tronqué. Vous pouvez également utiliser un littéral à virgule flottante au lieu d’un cast.
float divide(int i, int j) {
return static_cast<float>(i) / j;
}
float half(int i) {
return i / 2.0;
}
Notes
Si la troncation est intentionnelle, vous pouvez ajouter un cast explicite pour empêcher l’avertissement.
float int_divide(int i, int j) {
return static_cast<float>(i / j); // Not flagged because of the explicit cast.
}