Cette RFC proposait d’ajouter une option (un flag) supplémentaire à json_encode().

Elle partait en effet du constat que json_encode() encode le flottant 10.0 (côté PHP) vers l’entier 10 (côté JSON). L’opération inverse JSON → PHP donnait donc l’entier 10 (côté PHP) — et, donc, encoder puis décoder une donnée ne menait pas à la même information que celle de départ.

    // Actuellement
    echo json_encode(10.0); // Affiche 10
    echo json_encode(10.1); // Affiche 10.1
    var_dump(json_decode(json_encode(10.0))); // Affiche int(10)
    var_dump(10.0 === json_decode(json_encode(10.0))); // Affiche bool(false)

Par conséquent, il était proposé d’ajouter un nouveau flag JSON_PRESERVE_FRACTIONAL_PART qui entraînerait la conservation de cette information.

    // Proposé
    echo json_encode(10.0); // Affiche 10
    echo json_encode(10.1); // Affiche 10.1
    echo json_encode(10.0, JSON_PRESERVE_ZERO_FRACTION); // Affiche 10.0
    echo json_encode(10.1, JSON_PRESERVE_ZERO_FRACTION); // Affiche 10.1
    var_dump(json_decode(json_encode(10.0, JSON_PRESERVE_ZERO_FRACTION))); // Affiche double(10)
    var_dump(10.0 === json_decode(json_encode(10.0, JSON_PRESERVE_ZERO_FRACTION))); // Affiche bool(true)

Note

Stocker 10.0 sous la forme 10 ou sous la forme 10.0 en JSON est conforme à la spécification JSON, qui ne différencie pas les différents types de nombres — et certains langages convertissent en 10.0 alors que d’autres, comme PHP aujourd’hui, convertissent vers 10.

Les votes ont été ouverts sur cette RFC le 11 janvier 2015 pour être clôturés le 18 janvier 2015 et nous avons exprimé un avis favorable sur internals@.
Cette proposition a été adoptée par 14 voix contre aucune.