Maison php教程 php手册 Solutions aux calculs, comparaisons et arrondis en virgule flottante inexacts dans les bases de PHP_php

Solutions aux calculs, comparaisons et arrondis en virgule flottante inexacts dans les bases de PHP_php

May 16, 2016 am 09:00 AM
取整 浮点数

Comparaison des résultats des calculs en virgule flottante
Un exemple de calcul en virgule flottante est le suivant :

Copier le code Le code est le suivant :

$a = 0,2+0,7;
$b = 0,9;
var_dump($a == $b);

Le résultat imprimé est : bool(false). En d’autres termes, le résultat du calcul de 0,2+0,7 ici n’est pas égal à 0,9, ce qui est évidemment contraire à notre bon sens.

Concernant ce problème, le manuel officiel de PHP a déclaré un jour : Apparemment, une simple fraction décimale telle que 0,2 ne peut pas être convertie en un format binaire interne sans perdre un peu de précision. Cela est dû au fait qu’il est impossible d’exprimer exactement certaines fractions décimales avec un nombre fini de chiffres. Par exemple, 1/3 en décimal devient 0,3333333….

Nous imprimons les variables ci-dessus au format double précision :

Copier le code Le code est le suivant :

$a = 0,2+0,7;
$b = 0,9;
printf("%0.20f", $a);
echo '<br />';
printf("%0.20f", $b);

Les résultats de sortie sont les suivants :

Copier le code Le code est le suivant :

0.899999999999999991118
0.90000000000000002220

Évidemment, ici, en tant que données à virgule flottante, une partie de leur précision a été perdue et ne peut pas être complètement exacte. Ne vous fiez donc jamais à l’exactitude du résultat d’un nombre à virgule flottante jusqu’au dernier chiffre, et ne comparez jamais l’égalité de deux nombres à virgule flottante. Il est à noter qu'il ne s'agit pas d'un problème avec PHP, mais d'un problème avec le traitement interne de l'ordinateur des nombres à virgule flottante ! Le même problème sera rencontré dans des langages tels que C et JAVA.

Donc, pour comparer deux nombres à virgule flottante, nous devons les contrôler dans la plage de précision dont nous avons besoin avant de comparer, utilisez donc la fonction bcadd() pour ajouter les nombres à virgule flottante et convertir la précision (en chaîne) :

Copier le code Le code est le suivant :

var_dump(bcadd(0.2,0.7,1) == 0.9); // Sortie : bool(true)

Arrondi des nombres à virgule flottante

Dans l'article "Fonctions d'arrondi PHP Ceil et Floor", il y a un exemple :

Copier le code Le code est le suivant :

<?php
echo ceil(2.1/0.7); // Sortie : 4
?>

Après la discussion ci-dessus sur les calculs de nombres à virgule flottante, nous savons que cela est dû aux résultats inexacts du calcul des nombres à virgule flottante :

Copier le code Le code est le suivant :

<?php
printf("%0.20f", (2.1/0.7)); // Sortie : 3.00000000000000044409
?>

Après la discussion ci-dessus sur le calcul des nombres à virgule flottante, nous savons que cela est dû au résultat inexact du calcul des nombres à virgule flottante, nous pouvons donc utiliser la fonction round() pour y remédier :

Copier le code Le code est le suivant :

<?php
echo ceil( round((2.1/0.7),1) );
?>

Bien que la fonction round() arrondisse selon la précision spécifiée, conserver une décimale n'a aucun effet sur notre résultat d'arrondi.

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

Article chaud

Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Article chaud

Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Tags d'article chaud

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)

Méthode d'arrondi des nombres à virgule flottante PHP Méthode d'arrondi des nombres à virgule flottante PHP Mar 21, 2024 am 09:21 AM

Méthode d'arrondi des nombres à virgule flottante PHP

Comment convertir une chaîne en décimal en php Comment convertir une chaîne en décimal en php Mar 22, 2023 pm 03:22 PM

Comment convertir une chaîne en décimal en php

Comment diviser et arrondir en php Comment diviser et arrondir en php Mar 21, 2023 pm 02:52 PM

Comment diviser et arrondir en php

Convertir un nombre à virgule flottante en chaîne à l'aide de la fonction strconv.FormatFloat Convertir un nombre à virgule flottante en chaîne à l'aide de la fonction strconv.FormatFloat Jul 25, 2023 am 11:45 AM

Convertir un nombre à virgule flottante en chaîne à l'aide de la fonction strconv.FormatFloat

Causes et stratégies d'évitement des erreurs de calcul de virgule flottante PHP Causes et stratégies d'évitement des erreurs de calcul de virgule flottante PHP Feb 27, 2024 pm 06:33 PM

Causes et stratégies d'évitement des erreurs de calcul de virgule flottante PHP

Une explication approfondie de PHP BCMath : Libérer le potentiel des opérations sur les nombres Une explication approfondie de PHP BCMath : Libérer le potentiel des opérations sur les nombres Feb 23, 2024 am 09:10 AM

Une explication approfondie de PHP BCMath : Libérer le potentiel des opérations sur les nombres

Comment arrondir un nombre à virgule flottante à l'aide de la fonction Math.Truncate en C# Comment arrondir un nombre à virgule flottante à l'aide de la fonction Math.Truncate en C# Nov 18, 2023 pm 02:02 PM

Comment arrondir un nombre à virgule flottante à l'aide de la fonction Math.Truncate en C#

Arrondir les nombres à virgule flottante à l'aide de la fonction Math.Round en C# Arrondir les nombres à virgule flottante à l'aide de la fonction Math.Round en C# Nov 18, 2023 pm 02:17 PM

Arrondir les nombres à virgule flottante à l'aide de la fonction Math.Round en C#

See all articles