Maison > Article > développement back-end > Les opérations en virgule flottante en PHP sont-elles exactes ?
Non, il y a une erreur dans le fonctionnement en virgule flottante sous PHP. En PHP, les nombres à virgule flottante ont une précision limitée ; bien que selon le système, PHP utilise généralement le format double précision IEEE 754, l'erreur relative maximale due à l'arrondi est de « 1.11e-16 » ; les opérations mathématiques non basiques peuvent donner un A plus grand ; une erreur se produira et la propagation de l'erreur lors de l'exécution d'opérations composites doit être prise en compte.
L'environnement d'exploitation de ce tutoriel : système Windows 7, version PHP 8, ordinateur DELL G3
//加 $a = 0.1; $b = 0.7; $c = intval(($a + $b) * 10); echo $c."<br>"; //输出:7 //减 $a = 100; $b = 99.98; $c = $a - $b; echo $c."<br>"; //输出:0.019999999999996 //乘 $a = 0.58; $b = 100; $c = intval($a * $b); echo $c."<br>"; //输出:57 //除 $a = 0.7; $b = 0.1; $c = intval($a / $b); echo $c."<br>"; //输出:6
Les résultats ci-dessus ne sont évidemment pas ceux que nous souhaitons !
Le manuel PHP officiel l'explique comme suit :
Les nombres à virgule flottante ont une précision limitée. Bien que cela dépende du système, PHP utilise généralement le double format IEEE 754, donc l'erreur relative maximale due à l'arrondi est de 1.11e-16. Les opérations mathématiques non fondamentales peuvent donner lieu à des erreurs plus importantes, et la propagation des erreurs lors de l'exécution d'opérations composées doit être prise en compte. Ne faites jamais confiance à un résultat à virgule flottante jusqu'au dernier chiffre et ne comparez jamais deux nombres à virgule flottante pour vérifier leur égalité. Si vous avez vraiment besoin d'une plus grande précision, vous devez utiliser la fonction mathématique de précision arbitraire ou la fonction gmp.
La clé ici est que la décimale d'un nombre à virgule flottante est exprimée en binaire. Le processus est le suivant :
http://php.net/manual/zh/book.bc.php
Veuillez confirmer si bcmath a été installé avant de l'utiliser.
//加 $a = 0.1; $b = 0.7; $c = intval(bcadd($a, $b, 1) * 10); echo $c."<br>"; //输出:8 //减 $a = 100; $b = 99.98; $c = bcsub($a, $b, 2); echo $c."<br>"; //输出:0.02 //乘 $a = 0.58; $b = 100; $c = intval(bcmul($a, $b)); echo $c."<br>"; //输出:58 //除 $a = 0.7; $b = 0.1; $c = intval(bcdiv($a, $b)); echo $c."<br>"; //输出:7En plus de l'addition, de la soustraction, de la multiplication et de la division, bcmath fournit également les méthodes suivantes :
bcmodulo un nombre à précision arbitraire
bcpow Alimente un nombre à précision arbitraire
bcpowmod High précision Modulo la puissance des nombresbcscale Définit le nombre de décimales par défaut pour toutes les fonctions mathématiques bc
bcsqrt La racine carrée de tout nombre de précision
echo floor(5.1); //输出:5 echo floor(8.8); //输出:8
echo ceil(5.1); //输出:6 echo ceil(8.8); //输出:9
echo round(5.1); //输出:5 echo round(8.8); //输出:9 //保留两位小数并且进行四舍五入 echo round(5.123, 2); //输出:5.12 echo round(8.888, 2); //输出:8.89 //保留两位小数并且不进行四舍五入 echo substr(round(5.12345, 3), 0, -1); //输出:5.12 echo substr(round(8.88888, 3), 0, -1); //输出:8.88Méthode d'arrondi du banquier
Le code d'implémentation est le suivant :
echo round(1.2849, 2, PHP_ROUND_HALF_EVEN); //输出:1.28 echo round(1.2866, 2, PHP_ROUND_HALF_EVEN); //输出:1.29 echo round(1.2851, 2, PHP_ROUND_HALF_EVEN); //输出:1.29 echo round(1.2850, 2, PHP_ROUND_HALF_EVEN); //输出:1.28 echo round(1.2750, 2, PHP_ROUND_HALF_EVEN); //输出:1.28
Mise à jour Pour les instructions multi-tours, veuillez consulter le manuel officiel :
http://php.net/manual/zh/function .round.phpecho number_format('10000.98', 2, '.', ','); //输出:10,000.98 echo number_format('340888999', 2, '.', ','); //输出:340,888,999.00
Dans MySQL, il existe également un type à virgule flottante lors de la création de champs de table.
Grâce à la question de la précision des nombres à virgule flottante, nous avons appris que les décimales des nombres à virgule flottante sont représentées en binaire.
partagé l'utilisation des fonctions mathématiques de précision arbitraire PHP pour effectuer des opérations de haute précision.
Partage également des solutions de traitement numérique communes, telles que l'arrondi, l'arrondi, l'arrondi bancaire, le formatage numérique, etc.
Enfin, pensons au float de MySQL en passant par le float de PHP.
À l'avenir, lorsque vous utiliserez des calculs en virgule flottante, vous devrez être prudent, les détails déterminent le succès ou l'échec.
Apprentissage recommandé : "Tutoriel vidéo PHP"
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!