2017-07-14 3 views
0

There was ma question (d'abord pas si précis formulé):PHP: le format flotte avec une précision donnée dans json_encode() fonction

-je utiliser PHP flotte dans la chaîne JSON. Code:

$obj['val'] = '6.40'; 
json_encode($obj); 

est converti en:

{"val": "6.40"} 

Il est OK - je valeur de chaîne '6.40' en PHP et je valeur de chaîne "6.40" en JSON.

La situation est pas si bon si je dois utiliser des flotteurs:

$obj['val'] = 6.40; 
json_encode($obj); 

est converti en:

{"val": 6.4000000000000004} 

mais j'ai besoin:

{"val": 6.40} 

Comment puis-je convertir PHP flotte au numéro JSON dans 'json_encode' avec une précision donnée?

+0

Qu'est-ce que vous obtenez lorsque vous décodez '{ "val": 6,4000000000000004}' de l'autre côté (Javascript ou quoi que ce soit)? – axiac

+0

Cela devrait aider: https://stackoverflow.com/questions/20670114/what-is-the-exact-equivalent-of-js-something-tofixed-in-php –

+0

[Ce que tout informaticien doit connaître à virgule flottante] (https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – Barmar

Répondre

0

... et voici ma propre réponse:

<?php 
$obj['val'] = 6.40; 
$out = json_encode($obj); 
echo $out; // {"val":6.4} 

ini_set('precision', 17); 
$obj['val'] = 6.40; 
$out = json_encode($obj); 
echo $out; // {"val":6.4000000000000004} 

ini_set('precision', 2); 
$obj['val'] = 6.40; 
$out = json_encode($obj); 
echo $out; // {"val":6.4} 

Ceci est l'échantillon pour @axiac:

ini_set('precision', 4); 
$obj['val'] = 1/3; 
$out = json_encode($obj); 
echo $out; // {"val":0.3333} 
+1

Vous essayez de faire '1/3' égal à' 0.333333333' quand, en fait, tout le monde sait que peu importe combien de '3 'on met après le chiffre décimal, il est encore juste ** une approximation ** et ** pas exactement **' 1/3'. Il n'y a ** aucun moyen ** d'exprimer "6.04" exactement comme un flotteur. Tout ce que vous obtenez est une approximation et tout ce que votre "solution" fait est d'ignorer plus de chiffres que la représentation en virgule flottante fait déjà. À la fin, lorsque le JSON est décodé, vous obtiendrez '6.4000000000000004' de nouveau parce que c'est la valeur la plus proche de' 6.4' que la représentation en virgule flottante peut obtenir. – axiac