Dans le développement de PHP, la fonction CEIL () est souvent utilisée pour rassembler les nombres de points flottants. Cependant, de nombreux développeurs rencontrent des problèmes d'exception de précision inattendue lors de l'utilisation de ceil () . Cet article analysera en détail les raisons pour lesquelles ceil () provoque une précision anormale des données et introduira plusieurs méthodes pour éviter efficacement ce problème.
Ceil () est une fonction mathématique intégrée dans PHP, qui est utilisée pour arrondi un numéro de point flottant jusqu'à l'entier le plus proche. Par exemple:
<?php
echo ceil(4.1); // Sortir 5
echo ceil(9.999); // Sortir 10
?>
La fonction de ceil () est simple et claire, mais son entrée est un numéro de point flottant, et le numéro de point flottant lui-même a un problème de précision de représentation.
Les nombres à virgule flottante sont stockés en binaire dans les ordinateurs, et de nombreuses décimales ne peuvent pas être représentées avec précision par des bits binaires finis. Par exemple, 0,1 est une boucle infinie de décimales binaires dans une représentation de point flottante, entraînant une légère déviation dans la valeur stockée réelle.
Lorsque vous appelez la fonction ceil () , si la valeur stockée réelle du numéro de point flottant est légèrement plus petite ou légèrement plus grande que prévu, ceil () peut obtenir des résultats incompatibles avec les attentes.
Par exemple:
<?php
$num = 1.9999999999999999;
echo ceil($num); // S'attendre à être 2,En fait, c'est 2
$num = 1.0000000000000001;
echo ceil($num); // S'attendre à être 2,Mais en fait c'est 1,Parce que l'approximation de stockage des points flottants entraîne moins de 1.0000000000000001
?>
À l'heure actuelle, il semble qu'il y ait une différence après le point décimal, mais il est en fait causé par l'erreur dans le stockage des points flottants. Ceil () tourne vers le haut en fonction de l'approximation réelle, et des résultats inattendus peuvent se produire.
<?php
$price = 19.999999999999998;
echo ceil($price); // Sortir结果是 20,Répondre aux attentes
$price2 = 19.999999999999996;
echo ceil($price2); // Sortir结果是 20,Répondre aux attentes
$price3 = 19.999999999999994;
echo ceil($price3); // 也可能Sortir 20,La légère erreur des nombres de points flottants rend le résultat instable
?>
Dans de grandes quantités de systèmes informatiques ou financiers, ces erreurs peuvent entraîner des erreurs de logique commerciale.
PHP fournit des extensions BCMATH pour les calculs mathématiques de haute précision pour éviter les erreurs de points flottants.
<?php
$num = "19.999999999999998";
$result = bcadd($num, '0', 0); // réserve0Numéro décimal,Cela équivaut à l'arrondir vers le bas
if (bccomp($num, $result, 14) > 0) {
$result = bcadd($result, '1', 0); // si$numPlus grand que le résultat,Puis ajouter vers le haut1,simulationceilEffet
}
echo $result; // Sortir 20
?>
Arronner une certaine décimale sur les nombres de points flottants peut réduire l'impact de l'erreur de point flottante:
<?php
$num = 19.999999999999998;
$num = round($num, 10); // réserve10Numéro décimal
echo ceil($num);
?>
Convertir les numéros en chaînes et personnaliser la logique pour éviter les erreurs de calcul direct des nombres à virgule flottante.
Les systèmes financiers et de métrologie recommandent de stocker tous les montants en plus petites unités (telles que les segments) en tant qu'entiers, en évitant les numéros de points flottants. Après le traitement, revenez à l'unité requise.
La fonction CEIL () elle-même ne fera aucune erreur, mais en raison de la précision des numéros de points flottants, le résultat d'arrondi ne correspond pas aux attentes.
Le problème du stockage approximatif des nombres à virgule flottante dans les ordinateurs est la cause profonde.
L'exception de précision peut être réduite en utilisant d'abord l'extension BCMATH ou l'arrondi d'abord.
Dans les occasions critiques, il est recommandé d'éviter d'utiliser des nombres de points flottants et d'utiliser des entiers ou des chaînes pour les opérations de haute précision.