ID:          50224
 Updated by:  j...@php.net
 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] j...@php.net

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

Reply via email to