Maison >développement back-end >Problème PHP >Parlons de la perte de précision en php json_encode
PHP est un langage de programmation largement utilisé dans l'écriture d'applications Web, le traitement de bases de données, la création de scripts et la programmation côté serveur. Parmi eux, json_encode est une fonction très courante en PHP, utilisée pour convertir des tableaux et des objets PHP en chaînes JSON. Cette fonction est un outil très pratique et est très fréquemment utilisée dans la programmation quotidienne. Cependant, quelqu'un peut rencontrer un tel problème : lors de l'utilisation de la fonction json_encode pour convertir un tableau ou un objet PHP en chaîne JSON, la précision est parfois perdue. Cet article explorera la cause de ce problème.
Tout d’abord, comprenons ce qu’est JSON. JSON (JavaScript Object Notation) est un format de texte utilisé pour échanger des données. Il s'agit d'un format très léger, facile à lire et à comprendre. Le format JSON se compose de paires clé-valeur, et ces paires clé-valeur peuvent également contenir des tableaux et des objets imbriqués. Pour PHP, vous pouvez utiliser la fonction json_encode pour convertir des tableaux et des objets en chaînes au format JSON, et vous pouvez utiliser la fonction json_decode pour convertir des chaînes au format JSON en tableaux ou objets PHP.
Alors, pourquoi y a-t-il un problème de perte de précision lors de l'utilisation de la fonction json_encode pour la conversion ? Cela est dû au mécanisme de la fonction json_encode lors de la gestion des nombres à virgule flottante. En PHP, les nombres à virgule flottante sont généralement représentés au format à virgule flottante double précision de la norme IEEE 754. Au format JSON, les nombres à virgule flottante n'ont qu'une seule méthode de représentation, qui est la représentation décimale. Lorsqu'un tableau ou un objet PHP contient des données à virgule flottante double précision, la fonction json_encode entraînera une perte de précision lors de sa conversion en chaîne JSON, entraînant une perte de précision.
Ce qui suit est un exemple simple pour illustrer ce problème :
$array = array( 'foo' => 0.1, 'bar' => 0.7, 'baz' => 0.6 + 0.1 ); echo json_encode($array);
Le résultat de sortie est :
{"foo":0.1,"bar":0.69999999999999996,"baz":0.7}
Comme vous pouvez le voir, le tableau $array contient trois données de type nombre à virgule flottante, dont une est 0,6+0,1, json_encode Lorsque la fonction est convertie, elle est convertie en 0,7, ce qui pose le problème de la perte de précision. Le même problème se produira avec d’autres types de données à virgule flottante.
Alors, comment résoudre ce problème ? Il existe généralement deux méthodes :
1. Utilisez la fonction number_format pour arrondir les nombres à virgule flottante :
$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);
Le résultat de sortie est :
{"foo":"0.10","bar":"0.70","baz":"0.70"}
L'arrondi des nombres à virgule flottante via la fonction number_format peut résoudre le problème de la perte de précision. Cependant, cette approche est peu élégante et nécessite un traitement pour chaque nombre à virgule flottante.
2. Utilisez la fonction d'extension bcmath pour traiter les nombres à virgule flottante :
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);
Le résultat de sortie est :
{"foo":0.1,"bar":0.7,"baz":0.7}
En utilisant la fonction d'extension bcmath, la précision peut être réglée sur une valeur plus élevée, évitant ainsi le problème de perte de précision. La fonction json_encode_float dans le code est une encapsulation de la fonction json_encode et est utilisée pour traiter les données de type virgule flottante.
En résumé, le problème de perte de précision dans la fonction json_encode est causé par son mécanisme lorsqu'il s'agit de nombres à virgule flottante. Pour éviter toute perte de précision, vous pouvez arrondir les nombres à virgule flottante via la fonction number_format ou utiliser la fonction d'extension bcmath pour gérer les nombres à virgule flottante. Dans la programmation quotidienne, nous devons prêter attention à ce problème et adopter des méthodes appropriées pour éviter toute perte de précision.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!