


Pourquoi le calcul de la virgule flottante PHP est-il inexact ?
En programmation PHP, vous pouvez rencontrer le problème de calculs en virgule flottante inexacts. Comprendre la cause et la solution de ce problème peut améliorer la fiabilité et la précision de votre code.
1. Cause du problème
Les nombres à virgule flottante sont un moyen très pratique de représenter les nombres à virgule flottante, mais ils présentent également quelques inconvénients. La raison principale est que les ordinateurs utilisent le binaire pour stocker les nombres et ne peuvent pas représenter avec précision tous les nombres à virgule flottante. Cela entraîne des erreurs d’arrondi et une perte de précision.
Par exemple, imaginez un simple calcul en virgule flottante :
0.1 + 0.2 = 0.3
En PHP, le résultat de ce code est le suivant :
echo 0.1 + 0.2; //0.30000000000000004
Évidemment, ce résultat n'est pas celui auquel nous nous attendions. En effet, 0,1 et 0,2 ne peuvent pas être représentés avec précision sous forme de nombres binaires, ce qui entraîne des erreurs d'arrondi. Bien que cette erreur soit généralement faible, elle suffit à entraîner une perte de précision ou à créer des erreurs dans certains calculs de haute précision.
2. Solution
Pour le problème des calculs à virgule flottante inexacts, nous pouvons adopter les solutions suivantes :
- Utiliser des calculs entiers
Lorsque vous effectuez des calculs précis, vous pouvez d'abord convertir des nombres à virgule flottante en nombres entiers, puis effectuer calculs. Une fois le calcul terminé, le résultat est reconverti en nombre à virgule flottante.
Par exemple, considérons le calcul en virgule flottante suivant :
1.23 + 4.56 = 5.79
Les nombres à virgule flottante peuvent être convertis en nombres entiers pour le calcul :
$num1 = 123; $num2 = 456; $result = ($num1 + $num2) / 100; // 5.79
- Utilisation de BCMath
PHP fournit une extension BCMath qui peut être utilisée pour calculer avec précision des nombres de précision arbitraires . Les calculs à virgule flottante peuvent être effectués à l'aide de la bibliothèque BCMath, qui utilise des chaînes pour représenter des nombres au lieu de nombres à virgule flottante.
Par exemple, en utilisant la bibliothèque de fonctions BCMath pour calculer :
$val1 = '0.1'; $val2 = '0.2'; echo bcadd($val1, $val2, 1); // 0.3
Dans cet exemple, nous utilisons la fonction bcadd() pour effectuer une addition exacte en virgule flottante.
- Utilisez la fonction round()
Dans certains cas, la fonction round() peut être utilisée pour réduire l'erreur de précision. La fonction round() arrondit un nombre à virgule flottante à un nombre spécifié de décimales.
Par exemple, considérons le calcul suivant :
$num1 = 0.1; $num2 = 0.2; $result = round($num1 + $num2, 1); // 0.3
Cet exemple utilise la fonction round() pour arrondir le résultat à une décimale. Bien que cela n’élimine pas complètement l’erreur de précision, les résultats sont beaucoup plus proches de ce qui était attendu.
- Évitez la comparaison directe de nombres à virgule flottante
Lors de la comparaison de nombres à virgule flottante, un mécanisme de tolérance aux pannes doit être utilisé. Étant donné que la précision des nombres à virgule flottante peut souffrir d'erreurs d'arrondi, il n'est généralement pas fiable de comparer directement les valeurs de deux nombres à virgule flottante.
Par exemple, considérons la comparaison à virgule flottante suivante :
$val1 = 3.14159265; $val2 = 3.14159267; if ($val1 == $val2) { echo 'val1 等于 val2'; } else { echo 'val1 不等于 val2'; }
Dans cet exemple, nous comparons deux nombres à virgule flottante. Bien que ces deux chiffres soient proches, ils ne sont pas égaux. Par conséquent, le code affiche "val1 n'est pas égal à val2".
Si vous devez comparer deux nombres à virgule flottante, vous pouvez utiliser une valeur de tolérance ou une valeur delta. Une valeur de tolérance est un petit nombre qui peut tolérer une petite erreur dans un nombre à virgule flottante.
Par exemple, nous pouvons définir une valeur delta, qui représente l'erreur de précision maximale autorisée :
$delta = 0.00000001;
Avec la valeur delta, nous pouvons utiliser le code suivant pour comparer des nombres à virgule flottante :
$val1 = 3.14159265; $val2 = 3.14159267; if (abs($val1 - $val2) < $delta) { echo 'val1 等于 val2'; } else { echo 'val1 不等于 val2'; }
Dans cet exemple, nous utilisons le Fonction abs() Calculez la différence entre deux nombres à virgule flottante et comparez-la avec la valeur delta. Si la différence entre deux nombres est inférieure à la valeur delta, ils sont considérés comme égaux.
En bref, le problème des calculs en virgule flottante inexacts est un problème courant. En PHP, ce problème peut être résolu en utilisant des méthodes telles que l'arithmétique entière, la bibliothèque de fonctions BCMath, la fonction round() et la tolérance des valeurs delta. Selon la situation, différentes solutions peuvent être choisies.
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

La compilation JIT de PHP 8 améliore les performances en compilant le code fréquemment exécuté en code machine, bénéficiant aux applications avec des calculs lourds et en réduisant les temps d'exécution.

L'article traite de la sécurisation des téléchargements de fichiers PHP pour éviter les vulnérabilités comme l'injection de code. Il se concentre sur la validation du type de fichier, le stockage sécurisé et la gestion des erreurs pour améliorer la sécurité de l'application.

L'article traite des 10 meilleures vulnérabilités de l'OWASP dans les stratégies PHP et d'atténuation. Les problèmes clés incluent l'injection, l'authentification brisée et les XS, avec des outils recommandés pour surveiller et sécuriser les applications PHP.

L'article traite du cryptage symétrique et asymétrique en PHP, en comparant leur aptitude, leurs performances et leurs différences de sécurité. Le chiffrement symétrique est plus rapide et adapté aux données en vrac, tandis que l'asymétrique est utilisé pour l'échange de clés sécurisé.

L'article discute de la récupération des données des bases de données à l'aide de PHP, couvrant les étapes, les mesures de sécurité, les techniques d'optimisation et les erreurs communes avec des solutions. COMMANDE CHAPITRE: 159

L'article examine la mise en œuvre d'authentification et d'autorisation robustes dans PHP pour empêcher un accès non autorisé, détaillant les meilleures pratiques et recommandant des outils d'amélioration de la sécurité.

L'article traite des stratégies de mise en œuvre de la limitation du taux d'API en PHP, y compris des algorithmes comme un godet de jeton et un seau qui fuit, et en utilisant des bibliothèques comme Symfony / Rate-Limiter. Il couvre également la surveillance, l'ajustement dynamiquement des limites de taux et la main

L'article traite des stratégies pour prévenir les attaques du CSRF dans PHP, notamment en utilisant des jetons CSRF, des cookies de même site et une bonne gestion de session.
