Aktueller Standort: Startseite> Neueste Artikel> Warum ignorieren viele Menschen die Dezimalverarbeitung, wenn sie die CEIL () -Funktion von PHP verwenden und Berechnungen dividieren, was zu Fehlern im Ergebnis führt?

Warum ignorieren viele Menschen die Dezimalverarbeitung, wenn sie die CEIL () -Funktion von PHP verwenden und Berechnungen dividieren, was zu Fehlern im Ergebnis führt?

M66 2025-07-10

Bei der PHP -Programmierung wird die CEIL () -Funktion häufig verwendet, um die schwimmenden Punktzahlen nach oben zu runden, insbesondere in Szenarien wie Paging, Preisberechnung und Stapelverarbeitung. Wenn es jedoch bei Abteilungsvorgängen verwendet wird, kann es nicht nachweisbare logische Fehler verursachen, wenn die Dezimalstellen nicht ausreichend behandelt werden. Dieser Artikel wird sich mit diesem gemeinsamen Missverständnis und seinen Lösungen befassen.

Beispiel Missverständnis: Fehler in der Paging -Logik

Stellen Sie sich ein Paging -System vor, das 10 Datenstücke pro Seite mit insgesamt 95 Datenstücke anzeigt. Eine typische Möglichkeit zur Berechnung der Gesamtzahl der Seiten ist wie folgt:

<code> $ TotalItems = 95; $ itemSPERPAGE = 10; $ insgesamtpages = ceil ($ TotalItems / $ itselSPERPAGE); echo $ insgesamt; // Ausgabe: 10 </code>

In diesem einfachen Beispiel ist die Ausgabe korrekt. Sobald jedoch die Wertquelle von $ TotalItems ungewiss ist, z.

Zum Beispiel:

<code> $ TotalItems = intval ("95,4"); // wird als 95 nach Fehler $ itemSPERPAGE = 10 behandelt; $ insgesamtpages = ceil ($ TotalItems / $ itselSPERPAGE); // Die tatsächliche Erwartung beträgt 10 Seiten. // tatsächliche Ausgabe: 10 </code>

Obwohl dieses Ergebnis korrekt ist, führt die Annahme, dass die Gesamtsumme 94,1 beträgt, und das Eindringen in eine Ganzzahl zu einer weniger Zählung:

<Code> $ TotalItems = intval ("94,1"); // wird als 94 $ TotalPages = Ceil ($ TotalItems / 10) verarbeitet; // Ceil (9.4) => 10 </code>

Wenn Sie beispielsweise weiter nach unten drücken, verlassen Sie sich auf andere Berechnungen, um eine Dezimalzahlung zu erhalten.

<code> $ TotalItems = 94; $ itemSPERPAGE = 10; $ insgesamtpages = ceil ($ TotalItems / $ itselSPERPAGE); // Ceil (9.4) => 10 </code>

Das korrekte Ergebnis wird hier noch ausgegeben. Aber wenn Sie stattdessen Divisor verwenden:

<Code> $ TotalPages = Ceil (intDIV ($ TotalItems, $ itemSPerPage)); // intdiv (94, 10) => 9 </code>

Dieses Ergebnis ist falsch, da intDIV () den Dezimalteil direkt verurteilt und das abgerundete Ergebnis und Ceil () seine Bedeutung verloren haben.

Tiefe Gründe: implizite Konversion und Verständnis von Missverständnissen

Viele Entwickler glauben, dass das Ergebnis korrekt sein muss, solange sie Ceil () verwenden, und ignorieren, dass die Eingabe ceil () eine genaue schwebende Punktzahl sein muss. Sobald ein bestimmter Teil des Teilungsprozesses teilbar ist oder das Zwischenergebnis aufgrund der Typumwandlung von den Dezimalstellen verworfen wird, kann CEIL () basierend auf der falschen Eingabe ausgeführt werden.

Darüber hinaus gibt einige Datenbanken die Ergebnisse zurück, wenn es sich um Zeichenfolgen handelt. PHP hat einen Fehler, wenn es standardmäßig konvertiert wird:

<code> $ result = "94.8"; // Die von der Datenbank = Ceil ($ result / 10) erhaltene Zeichenfolge $ TotalPages; // automatisch in schwimmende Punktzahlen konvertieren, aber stellen Sie sicher, dass das Format korrekt ist </code>

Wenn das Ergebnis in einem nicht standardmäßigen Format verarbeitet wird, wie z .

Empfohlene korrekte Ansätze

Um die oben genannten Probleme zu vermeiden, besteht der empfohlene Ansatz darin, den Typ und die Genauigkeit explizit zu behandeln, um sicherzustellen, dass Ceil () den genauen schwimmenden Punktwert erhält:

  1. Verwenden Sie (float) gegossen:

    <Code>

$ insgesamtpages = ceil ((float) $ TotalItems / (float) $ ispoctsperPage);
</code>

  1. Vermeiden Sie es, intDIV () und Ceil () zu mischen. Wenn Sie die Integer Division verwenden müssen, wird empfohlen, auf der Grundlage des Restes zu richten:

    <Code>

$ insgesamtpages = intDIV ($ TotalItems, $ itselSPerPage);
if ($ TotalItems % $ itemSPERPage> 0) {
$ insgesamtpages += 1;
}
</code>

  1. Für Eingaben von Benutzern oder APIs wird empfohlen, floatval () anstelle von intval () zu verwenden, wie z. B.:

<Code> $ TotalItems = floatval ($ _ GET ['TOTAL'] ?? 0); </code>

Zusammenfassung

Bei Verwendung von PHP -Funktion von CEIL () ist es sehr einfach, logische Fehler zu verursachen, wenn die Dezimalzahl nicht ordnungsgemäß behandelt wird. Insbesondere bei Paging- oder Zähllogik können die Ergebnisse "fast korrekt" aussehen, aber es gibt tatsächliche Genauigkeitsfälligkeiten.

Entwickler sollten sich vor den Fallen der impliziten Typumwandlung und der Integer -Aufteilung vorsichtig sein, für Datentypen empfindlich bleiben und die Strenge und Korrektheit der Programmlogik durch explizite Konvertierung und angemessenes Urteilsvermögen sicherstellen.