Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mari kita bincangkan tentang kehilangan ketepatan dalam php json_encode

Mari kita bincangkan tentang kehilangan ketepatan dalam php json_encode

PHPz
PHPzasal
2023-03-29 10:09:451103semak imbas

PHP ialah bahasa pengaturcaraan yang digunakan secara meluas yang digunakan secara meluas dalam menulis aplikasi web, memproses pangkalan data, mencipta skrip dan pengaturcaraan sebelah pelayan. Antaranya, json_encode ialah fungsi yang sangat biasa dalam PHP, digunakan untuk menukar tatasusunan PHP dan objek kepada rentetan JSON. Fungsi ini adalah alat yang sangat mudah dan digunakan dengan kerap dalam pengaturcaraan harian. Walau bagaimanapun, seseorang mungkin menghadapi masalah sedemikian: apabila menggunakan fungsi json_encode untuk menukar tatasusunan atau objek PHP kepada rentetan JSON, kadangkala ketepatan hilang Artikel ini akan meneroka punca masalah ini.

Pertama, mari kita fahami apa itu JSON. JSON (JavaScript Object Notation) ialah format teks yang digunakan untuk bertukar-tukar data. Ia adalah format yang sangat ringan yang mudah dibaca dan difahami. Format JSON terdiri daripada pasangan nilai kunci dan pasangan nilai kunci ini juga boleh mengandungi tatasusunan dan objek bersarang. Untuk PHP, anda boleh menggunakan fungsi json_encode untuk menukar tatasusunan dan objek kepada rentetan berformat JSON dan anda boleh menggunakan fungsi json_decode untuk menukar rentetan berformat JSON kepada tatasusunan atau objek PHP.

Jadi, mengapa kehilangan ketepatan berlaku apabila menggunakan fungsi json_encode untuk penukaran? Ini disebabkan oleh mekanisme fungsi json_encode apabila mengendalikan nombor titik terapung. Dalam PHP, nombor titik terapung biasanya diwakili dalam format titik terapung berketepatan dua piawaian IEEE 754. Dalam format JSON, nombor titik terapung hanya mempunyai satu kaedah perwakilan, iaitu perwakilan perpuluhan. Apabila tatasusunan atau objek PHP mengandungi data titik terapung berketepatan ganda, fungsi json_encode akan menyebabkan kehilangan ketepatan apabila menukarnya kepada rentetan JSON, mengakibatkan kehilangan ketepatan.

Berikut ialah contoh mudah untuk menggambarkan masalah ini:

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

echo json_encode($array);

Hasil output ialah:

{"foo":0.1,"bar":0.69999999999999996,"baz":0.7}

Seperti yang anda lihat, tatasusunan $array mengandungi tiga Terdapat jenis data titik terapung, salah satunya ialah 0.6+0.1 Apabila fungsi json_encode menukarnya, ia menukarnya kepada 0.7, menyebabkan masalah kehilangan ketepatan. Masalah yang sama akan berlaku dengan jenis data titik terapung yang lain.

Jadi, bagaimana untuk menyelesaikan masalah ini? Biasanya terdapat dua kaedah:

1 Gunakan fungsi format_nombor untuk membundarkan nombor titik terapung:

$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);

Hasil keluarannya ialah:

{"foo":"0.10","bar":"0.70","baz":"0.70"}

Gunakan format_nombor. fungsi untuk membundar Nombor titik terapung dibundarkan untuk menyelesaikan masalah kehilangan ketepatan. Walau bagaimanapun, pendekatan ini adalah tidak elegan dan memerlukan pemprosesan untuk setiap nombor titik terapung.

2. Gunakan fungsi sambungan bcmath untuk memproses nombor titik terapung:

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);

Hasil output ialah:

{"foo":0.1,"bar":0.7,"baz":0.7}

Dengan menggunakan fungsi sambungan bcmath, ketepatan boleh ditetapkan Untuk nilai yang lebih tinggi, masalah kehilangan ketepatan dapat dielakkan. Fungsi json_encode_float dalam kod ialah enkapsulasi fungsi json_encode dan digunakan untuk memproses data jenis titik terapung.

Ringkasnya, masalah kehilangan ketepatan dalam fungsi json_encode disebabkan oleh mekanismenya apabila berurusan dengan nombor titik terapung. Untuk mengelakkan kehilangan ketepatan, anda boleh membundarkan nombor titik terapung melalui fungsi number_format, atau gunakan fungsi sambungan bcmath untuk mengendalikan nombor titik terapung. Dalam pengaturcaraan harian, kita harus memberi perhatian kepada masalah ini dan menggunakan kaedah yang sesuai untuk mengelakkan kehilangan ketepatan.

Atas ialah kandungan terperinci Mari kita bincangkan tentang kehilangan ketepatan dalam php json_encode. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn