Maison développement back-end Problème PHP Pourquoi le calcul de la virgule flottante PHP est-il inexact ?

Pourquoi le calcul de la virgule flottante PHP est-il inexact ?

Apr 23, 2023 am 10:09 AM

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
Copier après la connexion

En PHP, le résultat de ce code est le suivant :

echo 0.1 + 0.2; //0.30000000000000004
Copier après la connexion

É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 :

  1. 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
Copier après la connexion

Les nombres à virgule flottante peuvent être convertis en nombres entiers pour le calcul :

$num1 = 123;
$num2 = 456;

$result = ($num1 + $num2) / 100; // 5.79
Copier après la connexion
  1. 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
Copier après la connexion

Dans cet exemple, nous utilisons la fonction bcadd() pour effectuer une addition exacte en virgule flottante.

  1. 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
Copier après la connexion

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.

  1. É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';
}
Copier après la connexion

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;
Copier après la connexion

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';
}
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

PHP 8 JIT (juste à temps) Compilation: comment cela améliore les performances. PHP 8 JIT (juste à temps) Compilation: comment cela améliore les performances. Mar 25, 2025 am 10:37 AM

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.

Téléchargements de fichiers sécurisés PHP: prévention des vulnérabilités liées au fichier. Téléchargements de fichiers sécurisés PHP: prévention des vulnérabilités liées au fichier. Mar 26, 2025 pm 04:18 PM

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.

OWASP Top 10 PHP: Décrivez et atténue les vulnérabilités communes. OWASP Top 10 PHP: Décrivez et atténue les vulnérabilités communes. Mar 26, 2025 pm 04:13 PM

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.

Encryption PHP: cryptage symétrique vs asymétrique. Encryption PHP: cryptage symétrique vs asymétrique. Mar 25, 2025 pm 03:12 PM

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é.

Comment récupérer les données d'une base de données à l'aide de PHP? Comment récupérer les données d'une base de données à l'aide de PHP? Mar 20, 2025 pm 04:57 PM

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

Authentification PHP & amp; Autorisation: mise en œuvre sécurisée. Authentification PHP & amp; Autorisation: mise en œuvre sécurisée. Mar 25, 2025 pm 03:06 PM

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é.

Limitation du taux de l'API PHP: stratégies de mise en œuvre. Limitation du taux de l'API PHP: stratégies de mise en œuvre. Mar 26, 2025 pm 04:16 PM

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

Protection PHP CSRF: comment empêcher les attaques du CSRF. Protection PHP CSRF: comment empêcher les attaques du CSRF. Mar 25, 2025 pm 03:05 PM

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.

See all articles