ID: 50224 Updated by: [email protected] Reported By: christian dot lawrence at calorieking dot com Status: Bogus Bug Type: JSON related PHP Version: 5.2SVN-2009-11-19 (snap) New Comment:
Yes, IF you were passing fractional part. But you're not. See the output of var_dump($f) in your results.. Previous Comments: ------------------------------------------------------------------------ [2009-11-19 09:14:05] christian dot lawrence at calorieking dot com Take a look at the format for "number" at http://www.json.org/ and observe the form for a "int frac". This clearly indicates that there is support for representing a floating point number, even integer floats. The json_encode() function clearly supports encoding of floating point numbers. json_decode() is capable of deserialising "12.0" as a integer floating point number. If you encode a floating point number, then one should expect to decode a floating point number. If json_encode()/json_decode() is to be used as a serious and reliable data exchange format, then there should be no loss or conversion of primitive type information. Please re-consider. ------------------------------------------------------------------------ [2009-11-19 08:51:56] [email protected] There's is just "number" type in JSON for numbers. And as such, this is working just like it should and PHP tries it's best at guessing what type the numbers might be. ------------------------------------------------------------------------ [2009-11-19 05:45:10] christian dot lawrence at calorieking dot com Description: ------------ json_encode()-ing an integer when it is represented as floating point number results in a change of type when json_decode() decodes the output. Examples of such floating point numbers are: -123.0, -1.0, 0.0, 1.0, 123.0 Reproduce code: --------------- <?php function jsonRoundTrip($f) { $e = json_encode($f); $d = json_decode($e); var_dump($f, $e, $d); echo "\n"; } jsonRoundTrip(12.3); // This is a float jsonRoundTrip(12); // This is an integer jsonRoundTrip(12.0); // This is an integer represented as a float jsonRoundTrip(0.0); // This is an integer represented as a float ?> Expected result: ---------------- float(12.3) string(4) "12.3" float(12.3) int(12) string(2) "12" int(12) float(12) string(4) "12.0" float(12) float(0) string(3) "0.0" float(0) Actual result: -------------- float(12.3) string(4) "12.3" float(12.3) int(12) string(2) "12" int(12) float(12) string(2) "12" int(12) float(0) string(1) "0" int(0) ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=50224&edit=1
