php5.1.6だと15桁以上の数値が指数表記になる件

いまどきphp5.1.6を使っている時点でおかしいんだけど、以下メモ。

echo 1881330971012748; // 1.8813309710127E+15
echo (float)1881330971012748; // 1.8813309710127E+15

元のまま表示したい場合は以下のようにする

echo sprintf("%.0f",1881330971012748); // 1881330971012748

なお、指数表記からの完全な復元は不可能ぽい(下2桁が丸められちゃってるから)

echo sprintf("%.0f",1.8813309710127E+15); // 1881330971012700

困ったのがServices_JSON::decode()を使った時も、勝手に指数表記になってしまったこと。

仕方なく、Services_JSONの500行目あたりに以下のような手を加えて対応した。

// 以下の行を追加
if (strlen($str) > 14) { return $str; } 

// Return float or int, as appropriate
return ((float)$str == (integer)$str) 
    ? (integer)$str                   
    : (float)$str;