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

Reply via email to