In der PHP -Entwicklung wird die CEIL () -Funktion oft zum Runden verwendet, aber manchmal stellen wir fest, dass ihr Ergebnis nicht die Ganzzahl ist, die wir erwarten, was oft verwirrend ist. Tatsächlich ist der grundlegende Grund für diese Situation die Darstellung und den Betriebsfehler der schwimmenden Punktzahlen. In diesem Artikel wird die Ursachen dieses Problems im Detail analysiert und wirksame Lösungen bereitstellen.
Die Funktion der Funktion CEIL () besteht darin, eine Zahl nach oben zu runden und die kleinste Ganzzahl nicht weniger als diese Zahl zurückzugeben. Zum Beispiel:
<?php
echo ceil(3.2); // Ausgabe 4
echo ceil(7.0); // Ausgabe 7
?>
Unter normalen Umständen ist diese Funktion einfach und intuitiv zu verwenden.
In einigen Fällen hat die CEIL () -Funktion abnormale Ergebnisse, wie z. B.:
<?php
$num = 1.9999999999999998;
echo ceil($num); // 结果Ausgabe 2,Erwartungen erfüllen
$num = 1.9999999999999996;
echo ceil($num); // 结果Ausgabe 1,Unerwartet
?>
Warum hat letztere ein Ergebnis von 1 anstelle von 2 ? Dies liegt tatsächlich an der Genauigkeitsbeschränkung der schwimmenden Punktzahlen.
Schwimmpunkte in PHP sind doppelte Präzisionsfloat-Punktzahlen basierend auf dem IEEE 754-Standard. Diese Darstellung hat ihre inhärenten Genauigkeitsbeschränkungen, wodurch einige Dezimalstellen nicht genau vertreten werden können. Zum Beispiel:
<?php
var_dump(0.1 + 0.2);
// Ausgabe float(0.30000000000000004)
?>
Diese winzigen Fehler sammeln sich bei Mathematikoperationen an, was dazu führt, dass die von Ceil () verarbeiteten numerischen Werte tatsächlich etwas kleiner oder etwas größer sind als erwartet.
Betrachten Sie das folgende Beispiel:
<?php
$num = 2.0000000000000004;
echo ceil($num); // Ausgabe 3
$num2 = 1.9999999999999996;
echo ceil($num2); // Ausgabe 2,Aber die eigentliche Hoffnung ist 2
?>
Obwohl Num2 weniger als 2 aussieht, wird es aufgrund der schwimmenden Punktpräzision als eine Zahl weniger als 2 gespeichert, wodurch CEIL () anstelle von 1 abrundet.
Diese Art von Fehler kann zu schwerwiegenden Problemen bei Finanzberechnungen, der Einheit der Messumwandlung und anderen Szenarien führen.
Sie können zuerst die Funktion Round () verwenden, um die Anzahl der Dezimalstellen zu begrenzen und dann CEIL () zu verarbeiten:
<?php
$num = 1.9999999999999996;
$num = round($num, 8); // reservieren8Dezimalzahl
echo ceil($num); // 结果Ausgabe 2,Erwartungen erfüllen
?>
Diese Methode reduziert den Einfluss von schwimmenden Punktfehlern effektiv.
Wenn die Genauigkeitsanforderungen extrem hoch sind, können Sie die BCMath -Funktion von PHP verwenden:
<?php
$num = "1.9999999999999996";
$result = bcadd($num, '0', 0); // reservieren0Dezimalzahl,Es ist gleichbedeutend mit dem Rundgang nach unten
if (bccomp($num, $result, 10) > 0) {
$result = bcadd($result, '1', 0);
}
echo $result; // Ausgabe 2
?>
BCMath verwendet Zeichenfolgen, um Zahlen darzustellen, wodurch schwimmende Punktfehler vermieden werden.
Wenn der numerische Bereich zulässt, können Sie zuerst die Nummer vergrößern:
<?php
$num = 1.9999999999999996;
$scale = 8;
$num_scaled = (int)($num * pow(10, $scale));
$num_ceil = ceil($num_scaled / pow(10, $scale));
echo $num_ceil; // Ausgabe 2
?>
Diese Methode kann auch das Problem des Floating Point -Genauigkeitsfehlers lindern.
Die schwimmenden Punktzahlen in PHP haben aufgrund der zugrunde liegenden binären Darstellung Genauigkeitsfehler;
Die Funktion CEIL () selbst macht keine Fehler, aber der Fehler bewirkt, dass der Eingabeparameter unerwartet ist, was zu einer Abweichung im Ergebnis führt.
Verwenden Sie Round () , BCMATH-Erweiterung oder Zoom-In-Techniken, um Probleme effektiv zu vermeiden.
Nur durch das Verständnis der Art der schwimmenden Punktzahlen und durch geeignete Maßnahmen kann CEIL () eine genaue und zuverlässige Rolle bei PHP -Projekten spielen.