Heim > Backend-Entwicklung > PHP-Problem > Lassen Sie uns über den Präzisionsverlust in PHP JSON_ENCODE sprechen

Lassen Sie uns über den Präzisionsverlust in PHP JSON_ENCODE sprechen

PHPz
Freigeben: 2023-03-29 11:12:19
Original
1151 Leute haben es durchsucht

PHP ist eine weit verbreitete Programmiersprache, die häufig zum Schreiben von Webanwendungen, zum Verarbeiten von Datenbanken, zum Erstellen von Skripten und zur serverseitigen Programmierung verwendet wird. Unter diesen ist json_encode eine sehr häufige Funktion in PHP, die zum Konvertieren von PHP-Arrays und -Objekten in JSON-Strings verwendet wird. Diese Funktion ist ein sehr komfortables Werkzeug und wird in der täglichen Programmierung sehr häufig verwendet. Allerdings könnte jemand auf ein solches Problem stoßen: Bei der Verwendung der Funktion json_encode zum Konvertieren eines PHP-Arrays oder -Objekts in einen JSON-String geht manchmal die Genauigkeit verloren. In diesem Artikel wird die Ursache dieses Problems untersucht.

Lassen Sie uns zunächst verstehen, was JSON ist. JSON (JavaScript Object Notation) ist ein Textformat, das zum Austausch von Daten verwendet wird. Es handelt sich um ein sehr leichtes Format, das leicht zu lesen und zu verstehen ist. Das JSON-Format besteht aus Schlüssel-Wert-Paaren, und diese Schlüssel-Wert-Paare können auch Arrays und verschachtelte Objekte enthalten. Für PHP können Sie die Funktion json_encode verwenden, um Arrays und Objekte in JSON-formatierte Zeichenfolgen zu konvertieren, und Sie können die Funktion json_decode verwenden, um JSON-formatierte Zeichenfolgen in PHP-Arrays oder -Objekte zu konvertieren.

Warum gibt es also ein Problem mit Präzisionsverlusten, wenn die Funktion json_encode zur Konvertierung verwendet wird? Dies wird durch den Mechanismus der Funktion json_encode beim Umgang mit Gleitkommazahlen verursacht. In PHP werden Gleitkommazahlen normalerweise im Gleitkommaformat mit doppelter Genauigkeit des IEEE 754-Standards dargestellt. Im JSON-Format gibt es für Gleitkommazahlen nur eine Darstellungsmethode, nämlich die Dezimaldarstellung. Wenn ein PHP-Array oder -Objekt Gleitkommadaten mit doppelter Genauigkeit enthält, verursacht die Funktion json_encode beim Konvertieren in einen JSON-String einen Präzisionsverlust, was zu einem Präzisionsverlust führt.

Das Folgende ist ein einfaches Beispiel, um dieses Problem zu veranschaulichen:

$array = array(
    'foo' => 0.1,
    'bar' => 0.7,
    'baz' => 0.6 + 0.1
);

echo json_encode($array);
Nach dem Login kopieren

Das Ausgabeergebnis ist:

{"foo":0.1,"bar":0.69999999999999996,"baz":0.7}
Nach dem Login kopieren

Wie Sie sehen können, enthält das $array-Array drei Daten vom Typ Gleitkommazahl, von denen eine 0,6 + 0,1 ist, json_encode Wenn die Funktion konvertiert wird, wird sie in 0,7 konvertiert, was zu einem Genauigkeitsverlust führt. Das gleiche Problem tritt bei anderen Gleitkommadatentypen auf.

Also, wie kann man dieses Problem lösen? Normalerweise gibt es zwei Methoden:

1. Verwenden Sie die Funktion „number_format“, um Gleitkommazahlen zu runden:

$array = array(
    'foo' => number_format(0.1, 2, '.', ''),
    'bar' => number_format(0.7, 2, '.', ''),
    'baz' => number_format(0.6 + 0.1, 2, '.', '')
);

echo json_encode($array);
Nach dem Login kopieren

Das Ausgabeergebnis ist:

{"foo":"0.10","bar":"0.70","baz":"0.70"}
Nach dem Login kopieren

Das Runden von Gleitkommazahlen mit der Funktion „number_format“ kann das Problem des Präzisionsverlusts lösen. Dieser Ansatz ist jedoch unelegant und erfordert eine Verarbeitung für jede Gleitkommazahl.

2. Verwenden Sie die bcmath-Erweiterungsfunktion, um Gleitkommazahlen zu verarbeiten:

if (!function_exists('json_encode_float')) {
    function json_encode_float($val) {
        $precision = ini_get('precision');
        ini_set('precision', 16);
        $encoded = json_encode($val);
        ini_set('precision', $precision);
        return $encoded;
    }
}

$array = array(
    'foo' => 0.1,
    'bar' => 0.7,
    'baz' => 0.6 + 0.1
);

echo json_encode_float($array);
Nach dem Login kopieren

Das Ausgabeergebnis ist:

{"foo":0.1,"bar":0.7,"baz":0.7}
Nach dem Login kopieren

Durch die Verwendung der bcmath-Erweiterungsfunktion kann die Genauigkeit auf einen höheren Wert eingestellt werden, wodurch das Problem des Präzisionsverlusts vermieden wird. Die Funktion json_encode_float im Code ist eine Kapselung der Funktion json_encode und wird zur Verarbeitung von Daten vom Typ Gleitkomma verwendet.

Zusammenfassend lässt sich sagen, dass das Problem des Präzisionsverlusts in der Funktion json_encode durch ihren Mechanismus beim Umgang mit Gleitkommazahlen verursacht wird. Um Genauigkeitsverluste zu vermeiden, können Sie Gleitkommazahlen mit der Funktion „number_format“ runden oder die Erweiterungsfunktion bcmath verwenden, um Gleitkommazahlen zu verarbeiten. Bei der täglichen Programmierung sollten wir auf dieses Problem achten und geeignete Methoden anwenden, um Präzisionsverluste zu vermeiden.

Das obige ist der detaillierte Inhalt vonLassen Sie uns über den Präzisionsverlust in PHP JSON_ENCODE sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage