2017-07-14 3 views
0

There was meine Frage (zunächst nicht so genau formuliert):PHP: Format schwimmt mit bestimmten Präzision in json_encode() Funktion

Ich brauche PHP schwimmt in JSON-String zu verwenden. Code:

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

umgewandelt wird:

{"val": "6.40"} 

Es ist OK - ich String-Wert '6.40' in PHP und ich String-Wert "6.40" in JSON haben.

Die Situation ist nicht so gut, wenn ich Schwimmer verwenden müssen:

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

umgewandelt wird:

{"val": 6.4000000000000004} 

aber ich brauche:

{"val": 6.40} 

Wie kann ich konvertieren PHP schwebt zur JSON-Nummer in 'json_encode' mit gegebener Genauigkeit?

+0

Was bekommt man, wenn man '{ "val": 6,4000000000000004} dekodieren' auf der anderen Seite (Javascript oder was auch immer)? – axiac

+0

Das sollte helfen: https://stackoverflow.com/questions/20670114/what-is-the-exac-äquivalence-of-js-something-fixed-in-php –

+0

[Was jeder Informatiker wissen sollte über Gleitkomma] (https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – Barmar

Antwort

0

... und das ist meine eigene Antwort:

<?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} 

Dies ist ein Beispiel für @axiac:

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

Sie versuchen, '1/3' gleich '0.3333333333' zu machen, wenn tatsächlich jemand keine Sache weiß Wie viele '3' hinter der Dezimalziffer stehen, ist es immer noch ** eine Annäherung ** und ** nicht genau **' 1/3'. Es gibt keine Möglichkeit ** '6.04' genau wie ein Float auszudrücken. Alles, was Sie bekommen, ist eine Approximation und alles, was Ihre "Lösung" tut, besteht darin, mehr Ziffern zu ignorieren, als die Gleitkommadarstellung bereits tut. Am Ende, wenn der JSON decodiert ist, erhalten Sie '6.4000000000000004' wieder zurück, da dies der Wert ist, der der Gleitkommadarstellung am nächsten kommt. – axiac