


Fixpunkt -Mathematik in PHP mit BCMath, Pr?zisionsverlustf?lle
Feb 20, 2025 am 09:17 AM
Herausforderungen und Tipps für Fixpunkte numerische Operationen in PHP und MySQL
Bei der Behandlung von Fixpunktwerten ist eine extreme Versorgung erforderlich, insbesondere bei der Entwicklung mit PHP und MySQL. In diesem Artikel werden die Hindernisse und Details untersucht, die bei der Verwendung von PHP -BCMATH -Erweiterungen, der Verarbeitung von MySQL -Fixpunktexpression und festen Fixpunktdaten von PHP zu MySQL auftreten. Trotz einiger Herausforderungen werden wir versuchen, herauszufinden, wie Sie mit Fixpunktwerten umgehen und Genauigkeitsverluste vermeiden k?nnen.Zusammenfassung der Schlüsselpunkte
- Die BCMATH -Erweiterung in PHP unterstützt beliebige Pr?zisionsmathematikoperationen, kann jedoch zu Genauigkeitsverlust führen, wenn numerische Variablen an ihre Funktionen übergeben werden. Stringwerte, die Zahlen darstellen, sollten stattdessen verwendet werden, um dieses Problem zu vermeiden.
- MySQL unterstützt numerische Ausdrücke mit festem Punkt. Wenn jedoch ein Operand im exponentiellen oder string -Format ist, wird es als schwimmende Punktzahl angesehen. Die PDO -Erweiterung von PHP hat keinen Dezimalparametertyp für die Bindung, was zu ungenauen Ergebnissen führen kann.
- Um pr?zise mathematische Operationen in einer PHP MySQL -Anwendung auszuführen, k?nnen alle Vorg?nge in PHP verarbeitet werden und Daten k?nnen nur mit Anweisungen in Einfügen oder Aktualisierungen an MySQL angehalten werden. Alternativ k?nnen Sie SQL -Abfragen manuell erstellen, um sicherzustellen, dass alle mathematischen SQL -Ausdrücke in Dezimalzahlen dargestellt werden.
BCMath -Dokumentation stellt:
Für willkürliche Pr?zisionsmathematikoperationen bietet PHP einen Bin?rrechner, der jede Gr??e und Pr?zisionszahlen unterstützt, die als Zeichenfolgen ausgedrückt werden.Daher sollten die BCMATH -Funktionsparameter als Zeichenfolgen dargestellt werden. Wenn Sie eine numerische Variable an die BCMATH -Funktion übergeben, kann dies zu einem falschen Ergebnis führen.
Fall 1
echo bcmul(776.210000, '100', 10) . PHP_EOL; echo bcmul(776.211000, '100', 10) . PHP_EOL; echo bcmul(776.210100, '100', 10) . PHP_EOL; echo bcmul(50018850776.210000, '100', 10) . PHP_EOL; echo bcmul(50018850776.211000, '100', 10) . PHP_EOL; echo bcmul(50018850776.210100, '100', 10) . PHP_EOL;Das Ergebnis ist:
<code>77621.00 77621.100 77621.0100 5001885077621.00 5001885077621.100 5001885077621.00 //此處可見精度損失</code>übergeben Sie keine numerischen Variablen an die BCMATH -Funktion, nur Stringwerte, die Zahlen darstellen, werden übergeben. Auch wenn die schwimmenden Punktzahlen nicht verarbeitet werden, gibt BCMath seltsame Ergebnisse aus:
Fall 2
echo bcmul('10', 0.0001, 10) . PHP_EOL; echo bcmul('10', 0.00001, 10) . PHP_EOL; echo 10*0.00001 . PHP_EOL;Das Ergebnis ist:
<code>0.0010 0 // 這真的很奇怪!??! 0.0001</code>Der Grund dafür ist, dass BCMath seine Parameter in Zeichenfolgen umwandelt, und in einigen F?llen hat die String -Darstellung von Zahlen eine exponentielle Darstellung.
Fall 3
echo bcmul('10', '1e-4', 10) . PHP_EOL; // 也輸出 0PHP ist eine Sprache vom Typ Schwach, die in einigen F?llen keine strenge Kontrolle über Eingaben hat-dicht, um so viele Anfragen wie m?glich zu bearbeiten.
Zum Beispiel k?nnen wir "fix"
Fall 2 und Fall 3 :
$val = sprintf("%.10f", '1e-5'); echo bcmul('10', $val, 10) . PHP_EOL; // 給我們 0.0001000000Die gleiche Transformation wird jedoch das "richtige" Verhalten von
Fall 1 : zerst?ren
$val = sprintf("%.10f", '50018850776.2100000000'); echo bcmul('10', $val, 10) . PHP_EOL; echo bcmul('10', 50018850776.2100000000, 10) . PHP_EOL; 500188507762.0999908450 // 錯誤 500188507762.10 // 正確Die Sprintf -L?sung funktioniert also nicht mit BCMath. Unter der Annahme, dass alle Benutzereingaben Zeichenfolgen sind, k?nnen wir einen einfachen Validator implementieren, der die Anzahl aller exponentiellen Notationen erfasst und diese korrekt konvertiert. Diese Technik ist in PHP-Bignumbers implementiert, sodass wir Parameter wie 1E-20 und 50018850776.2101 sicher übergeben k?nnen, ohne die Genauigkeit zu verlieren.
bcmath endgültige Richtlinien
Verwenden Sie keine schwimmenden Punktnummern als Fixpunkt -Betriebsparameter in BCMATH -PHP -Erweiterungsfunktionen. Verwenden Sie nur Saiten.
Bei Verwendung des BCMATH -Erweiterungsvorgangs achten Sie auf die Parameter der exponentiellen Notation. Die BCMATH-Funktion verwaltet exponentielle Parameter nicht richtig (wie "1E-8"), sodass sie manuell konvertiert werden sollten. Achten Sie darauf, Sprintf oder ?hnliche Konvertierungstechniken nicht zu verwenden, da dies zu einem Genauigkeitsverlust führt.
Die Bibliothek von PHP-Bignumbers kann verwendet werden, die Eingabeparameter in exponentieller Form verarbeiten und den Benutzern mit mathematischen Fixpunktvorg?ngen an Fixpunkte versorgt. Seine Leistung ist jedoch nicht so gut wie BCMath -Erweiterungen, daher ist es ein Kompromiss zwischen robusten Paketen und Leistung.
mysql und feste Punktzahlen
In MySQL werden feste Punktzahlen mit dem Dezimalspalten -Typ verarbeitet. Sie k?nnen die offizielle MySQL -Dokumentation für Datentypen und pr?zise mathematische Operationen lesen.
Der interessanteste Teil ist, wie MySQL Ausdrücke umgeht:
Die Verarbeitung numerischer Ausdrücke h?ngt von der Art des im Ausdrucks enthaltenen Wertes ab:
Wenn eine N?herung vorliegt, ist der Ausdruck eine N?herung und wird unter Verwendung des Gleitkommaoperiums berechnet.
Wenn keine N?herung vorliegt, enth?lt der Ausdruck nur genaue Werte. Wenn ein genauer Wert den fraktionalen Teil (den Wert nach dem Dezimalpunkt) enth?lt, wird der Ausdruck unter Verwendung der pr?zisen Arithmetik mit einer 65-stelligen Genauigkeit berechnet. Das Wort "Pr?zision" ist durch das begrenzt, was in Bin?rdatum dargestellt werden kann. Beispielsweise kann 1.0/3.0 mit einer Dezimalbeschreibung ungef?hr auf 0,333 sein, kann jedoch nicht als genaue Zahlen geschrieben werden, so dass (1,0/3.0)*3.0 ungenau als 1,0 berechnet werden.
Andernfalls enth?lt der Ausdruck nur ganzzahlige Werte. Der Ausdruck ist pr?zise und wird unter Verwendung von Ganzzahlarithmetik mit der gleichen Genauigkeit wie Bigint (64 Bit) berechnet.
Wenn ein numerischer Ausdruck eine Zeichenfolge enth?lt, wird er in einen doppelten Precision-Gleitpunktwert umgewandelt und der Ausdruck ist ein ungef?hrer Wert.
Dies ist ein kurzes Beispiel, das den Fall des Dezimalteils demonstriert:
echo bcmul(776.210000, '100', 10) . PHP_EOL; echo bcmul(776.211000, '100', 10) . PHP_EOL; echo bcmul(776.210100, '100', 10) . PHP_EOL; echo bcmul(50018850776.210000, '100', 10) . PHP_EOL; echo bcmul(50018850776.211000, '100', 10) . PHP_EOL; echo bcmul(50018850776.210100, '100', 10) . PHP_EOL;
Das sieht einfach aus, aber lassen Sie uns sehen, wie man in PHP damit umgeht.
pr?zise mathematische Operationen in PHP und MySQL
Jetzt müssen wir jetzt feste Punktwerte von PHP nach MySQL bestehen. Der richtige Weg besteht darin, Vorverarbeitungsanweisungen und Platzhalter in der Abfrage zu verwenden. Dann machen wir Parameterbindung, alles ist sicher und zuverl?ssig.
<code>77621.00 77621.100 77621.0100 5001885077621.00 5001885077621.100 5001885077621.00 //此處可見精度損失</code>
Wenn wir den Wert an den Anweisungsplatzhalter binden, k?nnen wir seinen Typ durch den dritten Parameter von BindValue angeben. M?gliche Typen werden durch die Konstanten pdo :: param_bool, pdo :: param_null, pdo :: param_int, pdo :: param_str, pdo :: param_lob und pdo :: param_stmt dargestellt. Das Problem ist also, dass die PDO -Erweiterung PHP -PDO keinen Dezimalparametertyp für die Bindung aufweist. Infolgedessen werden alle mathematischen Ausdrücke in der Abfrage eher als schwimmende Punktausdrücke als als Fixpunktausdrücke behandelt.
Wenn wir die Vorverarbeitungsanweisungen nutzen und feste Punktnummern verwenden m?chten, besteht der beste Weg, die gesamte Mathematik in PHP auszuführen und das Ergebnis in MySQL zu speichern.
echo bcmul('10', 0.0001, 10) . PHP_EOL; echo bcmul('10', 0.00001, 10) . PHP_EOL; echo 10*0.00001 . PHP_EOL;
Schlussfolgerung
wir kamen zu folgender Schlussfolgerung:
- Verwenden Sie keine schwimmenden Punktnummern als Fixpunkt -Betriebsparameter in BCMATH -PHP -Erweiterungsfunktionen. Verwenden Sie nur Saiten.
- BCMATH -Erweiterung gilt nicht für Zeichenfolgennummern für exponentielle Notation.
- MySQL unterstützt numerische Ausdrücke mit festem Punkt, aber alle Operanden müssen im Dezimalformat sein. Wenn mindestens ein Parameter im Exponential- oder String -Format vorliegt, wird er als schwimmende Punktzahl behandelt und der Ausdruck als schwimmende Punktzahl berechnet.
- PDO -Erweiterung von PDO hat keinen Dezimalparametertyp. Wenn Sie also eine Vorverarbeitungsanweisung verwenden und Parameter in einem SQL -Expression mit festen Punktoperanden binden, erhalten Sie keine genauen Ergebnisse.
- Um pr?zise mathematische Operationen in einer PHP MySQL -Anwendung auszuführen, k?nnen Sie aus zwei Methoden ausw?hlen. Die erste Methode besteht darin, alle Vorg?nge in PHP zu verarbeiten und nur Insert- oder Aktualisierungsanweisungen zu verwenden, um Daten in MySQL zu bestehen. In diesem Fall k?nnen Sie vorbereitete Anweisungen und Parameterbindungen verwenden. Der zweite Ansatz besteht darin, SQL -Abfragen manuell zu erstellen (Sie k?nnen immer noch Vorverarbeitungsanweisungen verwenden, aber Sie müssen den Parametern selbst entkommen), damit alle mathematischen SQL -Ausdrücke in Dezimalzahlen ausgedrückt werden.
Meine pers?nliche Lieblingsmethode ist die erste: Machen Sie die gesamte Mathematik in PHP. Ich bin damit einverstanden, dass PHP und MySQL m?glicherweise nicht die beste Wahl für Anwendungen sind, die pr?zise mathematische Operationen erfordern. Wenn Sie sich jedoch für diesen Tech -Stapel entscheiden, ist es gut zu wissen, wie man richtig umgeht.
(Der FAQS -Teil wird aufgrund von Platzbeschr?nkungen weggelassen. Bei Bedarf kann der FAQS -Teil separat erzeugt werden.)
Das obige ist der detaillierte Inhalt vonFixpunkt -Mathematik in PHP mit BCMath, Pr?zisionsverlustf?lle. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

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

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

H?ufige Probleme und L?sungen für den variablen PHP -Umfang umfassen: 1. Die globale Variable kann innerhalb der Funktion nicht zugegriffen werden, und sie muss bei der Verwendung des globalen Schlüsselworts oder Parameters übergeben werden. 2. Die statische Variable wird statisch deklariert und nur einmal initialisiert und der Wert wird zwischen mehreren Aufrufen beibehalten. 3.. Hyperglobale Variablen wie $ _get und $ _post k?nnen direkt in jedem Bereich verwendet werden, aber Sie müssen auf eine sichere Filterung achten. 4. Die anonymen Funktionen müssen über das Schlüsselwort verwenden, und wenn Sie externe Variablen ?ndern, müssen Sie eine Referenz übergeben. Das Beherrschen dieser Regeln kann dazu beitragen, Fehler zu vermeiden und die Code -Stabilit?t zu verbessern.

Um PHP -Datei -Uploads sicher zu verarbeiten, müssen Sie die Quelle und die Type und die Eingabe des Dateinamens und des Pfades überprüfen, Serverbeschr?nkungen festlegen und Mediendateien zweimal verarbeiten. 1. überprüfen Sie die Upload -Quelle, um CSRF durch Token zu verhindern, und erkennen Sie den realen MIME -Typ über die Finfo_file mithilfe der Whitelist -Steuerung. 2. Benennen Sie die Datei in eine zuf?llige Zeichenfolge um und bestimmen Sie die Erweiterung, um sie gem?? dem Erkennungstyp in einem Verzeichnis ohne Web zu speichern. 3. Die PHP -Konfiguration begrenzt die Hochladengr??e und das tempor?re Verzeichnis Nginx/Apache verbietet den Zugriff auf das Upload -Verzeichnis. 4. Die GD -Bibliothek stellt die Bilder neu, um potenzielle b?swillige Daten zu l?schen.

Es gibt drei g?ngige Methoden für den PHP -Kommentarcode: 1. Verwenden Sie // oder #, um eine Codezeile zu blockieren, und es wird empfohlen, // zu verwenden. 2. Verwenden Sie /.../, um Codebl?cke mit mehreren Zeilen zu wickeln, die nicht verschachtelt werden k?nnen, aber gekreuzt werden k?nnen. 3.. Kombinationskenntnisse Kommentare wie die Verwendung / if () {} / Um Logikbl?cke zu steuern oder um die Effizienz mit Editor -Verknüpfungsschlüssel zu verbessern, sollten Sie auf die Schlie?ung von Symbolen achten und das Verschachteln bei der Verwendung vermeiden.

AgneeratorinphpiSamemory-effizientes WaytoiterateOverlargedatasetsByyieldingValueatimeinsteadofReturningThemallatonce.1.GeneratorsusetheyieldKeywordtoproduktenvaluesonDemand, ReducingMemoryUsage.2.TheyareusefulforfulforfulfordlingBiglopploups, Lesebiglochen, Leselungen, Lesebigs, Leselung, oder

Der Schlüssel zum Schreiben von PHP -Kommentaren liegt in der Kl?rung des Zwecks und der Spezifikationen. Kommentare sollten "Warum" und nicht "was getan" erkl?ren, um Redundanz oder zu Einfachheit zu vermeiden. 1. Verwenden Sie ein einheitliches Format wie Docblock (/*/) für Klassen- und Methodenbeschreibungen, um die Lesbarkeit und die Kompatibilit?t der Werkzeuge zu verbessern. 2. Betonen Sie die Gründe für die Logik, z. B. warum JS -Sprünge manuell ausgeben müssen. 3. Fügen Sie eine übersichtsbeschreibung vor komplexem Code hinzu, beschreiben Sie den Prozess in Schritten und helfen Sie, die Gesamtidee zu verstehen. V. Gute Anmerkungen k?nnen die Kommunikationskosten senken und die Effizienz der Code -Wartung verbessern.

Toinstallphpquickly, usexampponwindowsorhomebrewonmacos.1.onwindows, download undInstallxampp, SelectComponents, Startapache und PlaceFilesinhtdocscs.2.Anternativ, manuellinstallphpfrfr

In PHP k?nnen Sie quadratische Klammern oder lockige Klammern verwenden, um Zeichenfolgenspezifikationsspezifische Indexzeichen zu erhalten, aber quadratische Klammern werden empfohlen. Der Index startet von 0 und der Zugriff au?erhalb des Bereichs gibt einen Nullwert zurück und kann keinen Wert zugewiesen; MB_SUBSTR ist erforderlich, um Multi-Byte-Zeichen zu verarbeiten. Zum Beispiel: $ str = "Hallo"; echo $ str [0]; Ausgabe H; und chinesische Zeichen wie Mb_Substr ($ str, 1,1) müssen das richtige Ergebnis erzielen. In den tats?chlichen Anwendungen sollte die L?nge der Zeichenfolge vor dem Schleifen überprüft werden, dynamische Zeichenfolgen müssen für die Gültigkeit verifiziert werden, und mehrsprachige Projekte empfehlen, Multi-Byte-Sicherheitsfunktionen einheitlich zu verwenden.

Tolearnphpeffectival, startbysettingupalocalerverenVironmentusexs -LikexamppandacodeeditorikevScode.1) InstallxamppForapache, MySQL und Php.SeacodeeditorForsyntaxSupport.3) testyourscludingveliktingveliktelaThbiliodble.Neclyble.NektFile
