Inhaltsverzeichnis
Warum schwebende Punktmathematik schief geht
Verwenden Sie keine direkten Gleichstellungsvergleiche
Verwenden Sie BCMath oder GMP für die genaue Arithmetik
Bcmath: willkürliche Präzisions -Dezimalmathematik
GMP: Integer-basierte Mathematik mit hoher Präzision
Formatieren und Anzeigen von Problemen
Best Practices Zusammenfassung
Heim Backend-Entwicklung PHP-Tutorial Die Gefahren der Präzision: Umgang mit schwimmenden Punktzahlen in PHP

Die Gefahren der Präzision: Umgang mit schwimmenden Punktzahlen in PHP

Jul 26, 2025 am 09:41 AM
PHP Data Types

0,1 0,2! == 0,3 in PHP aufgrund von Präzisionsbeschränkungen der binären schwimmenden Punkte, sodass Entwickler direkte Vergleiche vermeiden und Epsilon-basierte Schecks verwenden, BCMath oder GMP für genaue Arithmetik verwenden, die Währungswährung in Ganzzahlen, wenn möglich, sorgfältig formatieren und sich für Finanzberechnungen niemals auf Float-Präzision verlassen.

Die Gefahren der Präzision: Umgang mit schwimmenden Punktzahlen in PHP

Bei der Arbeit mit Zahlen in PHP, insbesondere in finanziellen oder wissenschaftlichen Berechnungen, begegnen die Entwickler häufig auf subtile, aber schwerwiegende Probleme, die durch die Präzision der Schwimmpunkte verursacht werden. Während PHP Ganzzahlen und Zeichenfolgen vorhersehbar behandelt, kann die Gleitkomma-Arithmetik zu Ergebnissen führen, die auf den ersten Blick falsch erscheinen-wie 0.1 0.2 !== 0.3 . Dies ist kein Fehler in PHP. Es ist eine Folge, wie Computer die Dezimalzahlen in binär darstellen.

Die Gefahren der Präzision: Umgang mit schwimmenden Punktzahlen in PHP

Lassen Sie uns die Gefahren der schwimmenden Punktpräzision in PHP aufschlüsseln und wie man sie richtig umgeht.


Warum schwebende Punktmathematik schief geht

Floating-Punkt-Zahlen in PHP (wie in den meisten Programmiersprachen) folgen dem IEEE 754-Standard für binäre Darstellung. Das Problem tritt auf, da viele Dezimalfraktionen nicht genau in binär dargestellt werden können.

Die Gefahren der Präzision: Umgang mit schwimmenden Punktzahlen in PHP

Zum Beispiel:

 var_dump (0,1 0,2); // float (0.300000000000000004)
var_dump (0,1 0,2 == 0,3); // bool (falsch)

Dies geschieht, weil 0.1 und 0.2 die Fraktionen in Binär wiederholen, genau wie 1/3 0.333... in Dezimalzahl. Wenn sie in endgültigem Gedächtnis (64 Bit für ein Doppel) gespeichert werden, werden sie gerundet, was zu winzigen Ungenauigkeiten führt.

Die Gefahren der Präzision: Umgang mit schwimmenden Punktzahlen in PHP

Diese Rundungsfehler akkumulieren und können verursachen:

  • Falsche Vergleiche
  • Unerwartete Ergebnisse bei Berechnungen
  • Fehler in Finanzanträgen (z. B. falsche Gesamtzahl)

Verwenden Sie keine direkten Gleichstellungsvergleiche

Einer der häufigsten Fehler ist die Vergleich der Gleitkomma-Zahlen mit == oder === .

 // ❌ gefährlich
if (0,1 0,2 == 0,3) {
    echo "gleich"; // das wird nicht ausgeführt
}

Verwenden Sie stattdessen eine Toleranz (Epsilon) , um zu überprüfen, ob zwei Schwimmer "nahe genug" sind:

 // ✅ sicherer Vergleich
Funktion floatsequal ($ a, $ b, $ epsilon = 0,00001) {
    Return ABS ($ a - $ b) <$ epsilon;
}

if (floatsequal (0,1 0,2, 0,3)) {
    echo "effektiv gleich"; // Dies wird ausgeführt
}

Wählen Sie $epsilon basierend auf der erforderlichen Präzision Ihrer Anwendung. Für Geld ist 0.0001 oft ausreichend.


Verwenden Sie BCMath oder GMP für die genaue Arithmetik

Wenn die Präzision-wie bei finanziellen Berechnungen-kritisch ist, sollten Sie die Gleitkomma-Zahlen vollständig. PHP liefert BCMATH- und GMP -Erweiterungen für willkürliche Präzisionsarithmetik.

Bcmath: willkürliche Präzisions -Dezimalmathematik

BCMath arbeitet mit Zahlen als Zeichenfolgen und unterstützt Addition, Subtraktion, Multiplikation, Teilung usw. mit genauer Präzision.

 // Beispiel: 0,1 0,2 = 0,3, genau
$ result = bcadd (&#39;0,1&#39;, &#39;0,2&#39;, 1); // &#39;0,3&#39;

Hinweis: Alle Operanden müssen Zeichenfolgen sein, und Sie geben die Skala an (Anzahl der Dezimalstellen).

Weitere Beispiele:

 echo bcmul (&#39;0,1&#39;, &#39;0,2&#39;, 2); // &#39;0,02&#39;
echo bcdiv (&#39;1,0&#39;, &#39;3,0&#39;, 5); // &#39;0,33333&#39;

Bcmath ist ideal für:

  • Währungsberechnungen
  • Steuer-, Zins- oder Rechnungsprüfungszahlen
  • Jede Situation, in der Rundungsfehler inakzeptabel sind

GMP: Integer-basierte Mathematik mit hoher Präzision

GMP ist für große Ganzzahlen effizienter, funktioniert jedoch am besten, wenn Sie Werte skalieren können (z. B. Cent anstelle von Dollar).

 $ betragen1 = gmp_init (10); // 10 Cent
$ betragen2 = gmp_init (20); // 20 Cent
$ Total = Gmp_add ($ Betrag1, $ Betrag2); // 30 Cent
echo gmp_strval ($ insgesamt); // "30"

Dies vermeidet Dezimalstellen vollständig - hoffentlich in Zahlungssystemen.


Formatieren und Anzeigen von Problemen

Auch wenn interne Berechnungen korrekt sind, kann das Anzeigen von Schwimmern irreführen:

 Echo 0,29 * 100; // könnte 28.9999999999999996 zeigen

Verwenden Sie number_format() oder printf() um die Ausgabe zu steuern:

 echo number_format (0,29 * 100, 2); // "29.00"

Aber denken Sie daran: Formatieren beeinflussen nur die Anzeige, nicht den zugrunde liegenden Wert.


Best Practices Zusammenfassung

Um zu vermeiden, dass Floßpunkt-Fallstricke in PHP:

  • Vergleiche Floats niemals direkt - verwenden Sie einen Epsilon.
  • Verwenden Sie BCMATH für finanzielle oder hochpräzise Dezimalmathematik.
  • ✅ Wenn möglich in Cent (Ganzzahlen) Währung speichern .
  • Validieren und runde Eingangswerte absichtlich validieren.
  • Seien Sie vorsichtig mit dem Jonglieren des Typs - Php könnte stillschweigend Saiten in Schwimmer umwandeln.

Beispiel für sichere Geldbearbeitung:

 // mit BCMath zwei Beträge in Cent in Cent hinzufügen
Funktion addmoney ($ a, $ b) {
    Return bcadd ($ a, $ b, 0); // Keine Dezimalstellen für Cent
}

$ TotalCents = AddMoney (&#39;150&#39;, &#39;250&#39;); // &#39;400&#39; Cent = $ 4,00

Gleitkomma-Zahlen sind nützlich für wissenschaftliche oder ungefähre Berechnungen, aber sie sind schlecht für genaue Arithmetik. In PHP besteht der Schlüssel darin, zu wissen, wann das Standard -Float -Verhalten aussteigen und Tools wie BCMath verwendet werden, um die Genauigkeit zu erhalten.

Grundsätzlich: Wenn Präzision wichtig ist, vertrauen Sie dem Dezimalpunkt nicht - die Kontrolle davon.

Das obige ist der detaillierte Inhalt vonDie Gefahren der Präzision: Umgang mit schwimmenden Punktzahlen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

PHP-Tutorial
1535
276
Modernisierung Ihrer Codebasis mit den Gewerkschaftstypen von PHP 8 Modernisierung Ihrer Codebasis mit den Gewerkschaftstypen von PHP 8 Jul 27, 2025 am 04:33 AM

Upgradephp7.xcodeBasiestophp8 BYREPLACKINGPHPDOC-SUGGEDTYPESHALT@paramstring | intwithnativeUnionTypesuchassstring | intforParameterSandRetReturntypes, welcheimprovestypesafetyandandclarity;

PHP 8.1 Enums: Ein neues Paradigma für Typ-Safe-Konstanten PHP 8.1 Enums: Ein neues Paradigma für Typ-Safe-Konstanten Jul 28, 2025 am 04:43 AM

In Php8.1 eingeführte Enums liefert eine konstante Erfassung, die das Problem mit dem magischen Wert löst. 1. Verwenden Sie Enum, um feste Konstanten wie Status :: Draft zu definieren, um sicherzustellen, dass nur vordefinierte Werte verfügbar sind. 2. Binden Sie die Aufenthalte an Saiten oder Ganzzahlen durch BackEdums und unterstützen Sie die Konvertierung von () und TryFrom () zwischen Skalaren und Enums; 3. Enums können Methoden und Verhaltensweisen wie Color () und IsEditable () definieren, um die Kapselung der Geschäftslogik zu verbessern. 4. Anwendbar auf statische Szenarien wie Zustand und Konfiguration, nicht für dynamische Daten; 5. Es kann die Schnittstelle von Unitenum oder BackedENum für Typeinschränkungen implementieren, die Code -Robustheit und die IDE -Unterstützung verbessern und ist IS

Die Gefahren der Präzision: Umgang mit schwimmenden Punktzahlen in PHP Die Gefahren der Präzision: Umgang mit schwimmenden Punktzahlen in PHP Jul 26, 2025 am 09:41 AM

0,1 0,2! == 0.3inphpdueToBinaryfloating-PunktPrecisionLimitations, SodvelopersMustavoidDirectComparisonsanduSepsilon-basiert, EmploybcMathorgmpforxactaritaritaritaritaritaritaritaritaritarithmus, StorecurrencyInintible-Possible, formatoutputciptcusefuls

Die Dualität von PHP: Navigieren Sie lose Tipps im Vergleich zu strengen Typdeklarationen Die Dualität von PHP: Navigieren Sie lose Tipps im Vergleich zu strengen Typdeklarationen Jul 26, 2025 am 09:42 AM

PHP unterstützt die Koexistenz von losen Typen und strengen Typen, was das Kernmerkmal seiner Entwicklung von Skriptsprachen bis hin zu modernen Programmiersprachen ist. 1. Lose Typen eignen sich zum schnellen Prototyping, zur Behandlung der dynamischen Benutzereingabe oder zum Docken mit externen APIs. Es gibt jedoch Probleme wie das Risiko einer impliziten Typumwandlung, Schwierigkeiten beim Debuggen und der schwachen Toolunterstützung. 2. Strikter Typ ist durch Declare (strict_types = 1) aktiviert, das Fehler im Voraus erkennen, die Code -Lesbarkeit und die IDE -Unterstützung verbessern und für Szenarien mit hohen Anforderungen für die Kerngeschäftslogik, die Zusammenarbeit der Teams und die Datenintegrität geeignet ist. 3. Die gemischte Verwendung sollte in der tatsächlichen Entwicklung verwendet werden: Strenge Typen sind standardmäßig aktiviert, lose Typen werden nur bei Bedarf an den Eingangsgrenzen verwendet, und die Überprüfung und Typumwandlung werden so bald wie möglich durchgeführt. 4. Empfohlene Praktiken umfassen die Verwendung von PHPSTA

Verständnis des 'Callable' -Pseudo-Typs und seiner Implementierung Verständnis des 'Callable' -Pseudo-Typs und seiner Implementierung Jul 27, 2025 am 04:29 AM

AcallableInphpisapseudo-typerepresentingyvaluethatcanBeinvokeeduedthe () -Operator, verwendet PriminalerFlexibleCodeIncallbacksandHigher-Orderfunktionen;

Von 'gemischt' bis `void`: Ein praktischer Leitfaden für PHP -Rückgabetypdeklarationen Von 'gemischt' bis `void`: Ein praktischer Leitfaden für PHP -Rückgabetypdeklarationen Jul 27, 2025 am 12:11 AM

ReturntypesinphpimProvecodereLabilityandClarityBySpicifyingWhatafunctionMustreturn.2. UseBasictypeslikestring, ordatetimetoEnforceCorrectreturnValuesandCatchErary.3.ApplyNulletypeswithtypeswith? (E.G

Die Lebensdauer einer Variablen: Die interne 'Zval' -Struktur von PHP erklärte Die Lebensdauer einer Variablen: Die interne 'Zval' -Struktur von PHP erklärte Jul 27, 2025 am 03:47 AM

PHP verwendet die ZVAL -Struktur, um Variablen zu verwalten. Die Antwort lautet: 1. ZVAL enthält Werte, Typen und Metadaten mit einer Größe von 16 Bytes; 2. Wenn sich der Typ ändert, müssen nur die Gewerkschafts- und Typinformationen aktualisiert werden. 3.. Komplexe Typen beziehen sich auf Strukturen mit Referenzzahlen durch Zeiger; 4. Wenn Werte zugewiesen werden, wird die Kopie verwendet, um den Speicher zu optimieren. 5. Referenzen lassen Variablen das gleiche ZVAL teilen; 6. Recyclingreferenzen werden von einem speziellen Müllsammler verarbeitet. Dies erklärt den zugrunde liegenden Mechanismus des PHP -variablen Verhaltens.

Ressourcenmanagement in PHP: Der Lebenszyklus eines 'Ressourcen' -Typs Ressourcenmanagement in PHP: Der Lebenszyklus eines 'Ressourcen' -Typs Jul 27, 2025 am 04:30 AM

Der Lebenszyklus von PHP -Ressourcen ist in drei Stufen unterteilt: 1. Ressourcenerstellung, wobei externe Systemgriffe durch Funktionen wie fopen und curl_init erhalten; 2.. 3.. Ressourcenzerstörung, manuell aufgerufene FCLOSE, CURL_CLOSE und andere Funktionen sollten Priorität für die Freigabe von Ressourcen erhalten, um nicht auf die automatische Müllsammlung zu stützen, um zu verhindern, dass Dateideskriptoren anstrengend sind. Zu den Best Practices gehören: Immer explizit Ressourcen schließen, versuchenden Sie ... stellen Sie schließlich die Reinigung sicher, priorisieren Sie Objekte wie PDO, die __Destruct unterstützt, globale Speicherressourcen vermeiden und aktive Ressourcen über Get_Resources () überwachen ().

See all articles