Die Größe von Ganzzahlen in PHP ist plattformabhängig .
Die Größe einer Ganzzahl ist plattformabhängig, obwohl ein Maximalwert von etwa zwei Milliarden der übliche Wert ist (das sind 32 Bit Vorzeichen). 64-Bit-Plattformen haben normalerweise einen Maximalwert von etwa 9E18. PHP unterstützt keine vorzeichenlosen Ganzzahlen. Die Ganzzahlgröße kann mit der Konstanten PHP_INT_SIZE und der Maximalwert mit der Konstanten PHP_INT_MAX seit PHP 4.4.0 und PHP 5.0.5 bestimmt werden.
Die Größe der Schwimmer ist auch plattformabhängig :
Die Größe eines Floats ist plattformabhängig, obwohl ein Maximum von ~ 1,8e308 mit einer Genauigkeit von ungefähr 14 Dezimalstellen ein üblicher Wert ist (das 64-Bit-IEEE-Format).
und es gibt eine große rote Warnung im Handbuch über die Präzision des Schwimmers:
Gleitkommazahlen haben eine begrenzte Genauigkeit. Obwohl dies vom System abhängt, verwendet PHP normalerweise das IEEE 754-Format mit doppelter Genauigkeit, das aufgrund von Rundungen in der Größenordnung von 1.11e-16 einen maximalen relativen Fehler ergibt. Nicht elementare arithmetische Operationen können größere Fehler ergeben, und natürlich muss die Fehlerprogression berücksichtigt werden, wenn mehrere Operationen zusammengesetzt werden.
Darüber hinaus haben rationale Zahlen, die genau als Gleitkommazahlen in Basis 10 dargestellt werden können, wie 0,1 oder 0,7, keine exakte Darstellung als Gleitkommazahlen in Basis 2, die intern verwendet wird, unabhängig von der Größe der Mantisse. Daher können sie nicht ohne einen geringen Genauigkeitsverlust in ihre internen binären Gegenstücke umgewandelt werden. Dies kann zu verwirrenden Ergebnissen führen: Beispielsweise gibt Etage ((0,1 + 0,7) * 10) normalerweise 7 anstelle der erwarteten 8 zurück, da die interne Darstellung etwa 7,999999999999991111 beträgt.
Die BC Math-Erweiterung umgeht die Abhängigkeiten, sodass Sie eine große Ganzzahl explizit als Zeichenfolge angeben und die PHP-Interpretation von Ganzzahlliteralen vermeiden können. Die GMP-Funktionen sind ebenfalls gute Alternativen und funktionieren auf ähnliche Weise. Wir können davon ausgehen, dass any sizesich dies auf die maximale Größe von Zeichenfolgen bezieht, die nur durch den verfügbaren Speicher begrenzt ist :
Es ist kein Problem, wenn eine Zeichenfolge sehr groß wird. PHP setzt der Größe eines Strings keine Grenzen. Die einzige Grenze ist der verfügbare Speicher des Computers, auf dem PHP ausgeführt wird.
Ob es sinnvoll ist oder nicht, kann nur von Fall zu Fall entschieden werden. Ich habe noch nie tatsächliche Leistungsprobleme mit den Funktionen der Erweiterung bemerkt, aber mit Sicherheit sind sie nicht so schnell wie native Alternativen.
Ist es wirklich notwendig?
Es ist nur notwendig, wenn es ist, aber das ist nicht immer offensichtlich. Sie können offensichtlichen Missbrauch leicht erkennen, aber nicht so leicht über komplexere Szenarien streiten.
Besprechen Sie mit Ihrem Kollegen, warum er sie überall verwendet . Überläufe führen zu extrem hässlichen Situationen, die ich nur schwer identifizieren und lösen kann. Wenn er BC Math missbraucht, könnte dies daran liegen, dass er einmal schrecklich feststeckte und versucht, so sicher wie möglich zu sein. Obwohl die Verwendung von BC Math von Natur aus nichts auszusetzen hat, kann die ansonsten unbedeutende Leistungsminderung in mehreren Szenarien ein ernstes Problem darstellen. Wenn Sie Leistungsprobleme feststellen, stellen Sie sicher, dass Sie Ihre Anwendung profilieren und sicherstellen, dass sie mit BC Math zusammenhängt.
Denken Sie immer daran, dass Ihre Berechnungen korrekt funktionieren sollten:
- Auf jedem System, auf das Sie abzielen, sind einzelne Entwicklermaschinen und (natürlich) Produktionsmaschinen enthalten.
- Unabhängig von möglichen System- / Plattform-Upgrades oder -Downgrades.
Bei der Entwicklung mehrerer Plattformen sollten Sie immer die niedrigste Grenze als harte Grenze betrachten. Wenn Sie absolut sicher sind, dass Ihre Berechnungen die Grenzwerte (einschließlich ihrer Ergebnisse) nicht überschreiten, macht die Verwendung von BC Math keinen Sinn.
Aber wenn das, was Sie beschreiben , ist , dass er am liebsten echo bcadd("1", "2");über echo 1+2;, na ja, viel Glück!
Ich fand einen äußerst interessanten und relevanten Blog-Beitrag in meiner riesigen Liste von Lesezeichen, Ganzzahlen in PHP, die mit einer Schere ausgeführt werden, und Portabilität in Perconas MySQL Performance-Blog. Es ist alt (2007), bietet aber einen guten Überblick über verschiedene Snafus mit ganzzahliger Portabilität in PHP.