Explication détaillée du problème de précision de la multiplication en double précision dans .NET
En C#, le résultat de l'expression double i = 10 * 0.69;
est que i
se voit attribuer la valeur 6,899999999999999995 au lieu de la valeur attendue 6,9. Cela soulève la question : y a-t-il un problème avec la multiplication double précision dans .NET ?
Représentation binaire et opérations en virgule flottante
Pour comprendre ce comportement, il faut avoir une compréhension approfondie des subtilités de la représentation binaire et de l'arithmétique à virgule flottante. Les formats à virgule flottante représentent approximativement les nombres réels sous forme de valeurs binaires finies, ce qui peut entraîner des limitations de précision.
Le 0,69, apparemment simple, ne peut pas être exprimé avec précision en binaire. Cela nécessite une séquence en boucle infinie de nombres binaires. La représentation binaire stockée dans le type de données double
est une approximation de 0,69.
Optimisation du compilateur et constantes stockées
Dans l'extrait de code fourni, le compilateur optimise l'expression en effectuant une multiplication et en stockant le résultat sous forme de constante dans l'exécutable. Il le fait parce que les valeurs sont connues au moment de la compilation. La valeur stockée est une approximation à virgule flottante de 6,9, légèrement inférieure à la valeur réelle.
Solutions de contournement et types de données alternatifs
Pour résoudre ce problème et obtenir des résultats plus précis, vous pouvez utiliser le type de données decimal
, conçu pour représenter des valeurs décimales non répétitives avec une plus grande précision. L'expression decimal i = 10m * 0.69m;
rapportera 6,9 millions.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!