2017-05-09 18 views
4

PHPは、それがjson_encodeで小数点以下の桁数を処理する方法にa bugを持っているようです。PHP 7.1.1でjson_encodeの値を浮動小数点化する方法は?

簡単なフロート符号化することで、単に見ることは簡単です:

echo json_encode(["testVal" => 0.830]); 

// Prints out: 
{"testVal":0.82999999999999996003197111349436454474925994873046875} 

を私は、サーバー管理者の多くはないんだけど、その脇のphp.iniに入ると-1にserialize_precisionを変更するから、そこにありますその設定が変更された環境で実行されていることを確認できないときに私のコードでこれを防ぐためにできることは何ですか?

EDIT: 私はいくつかのコメントは、浮動小数点不正確が存在する理由の一般的な議論にリンクしたいと確信しています。そんなこと知ってる。ここで私の質問は、PHPでそれを扱うためのベストプラクティスと、それに対して防衛的にコーディングする方法があるかどうかについてです。確かに文字列として浮動小数点を送るよりも良い方法があります。

+0

これは、同様に7.0で発生しますか? –

+0

リンク先のバグレポートの説明が明確になるため、これはバグではなく意図的な機能です。サーバが浮動小数点数を高精度にシリアル化するように設定されている場合、 'json_encode'はこれを尊重します。 – IMSoP

+0

そしてその値を文字列として書いたら?それからあなたはあなたが望む正確な数を持っています。 – Stony

答えて

6

あなたは 'precision' と 'serialize_precision' のparamsを設定する必要があります。

precision = 14 
serialize_precision = -1 

テストケースは:

php -r 'ini_set("precision", 14); ini_set("serialize_precision", -1); var_dump(json_encode(["testVal" => 0.830]));' 
string(16) "{"testVal":0.83}" 
+0

それを変更するもの文書化されている[ドキュメントの変更履歴](// php.net/manual/en/function.json-encode.php#refsect1-function.json-encode-changelog)にリンクすると便利かもしれません。特に、 'precision 'の変更はもはや' json_encode'には影響しません。 –

+0

@Justastudentのおかげで、7.1のために、多くの人がまだ5.6+を使用し、誰にとっても有用であろうので、上記の答え5.6を使用して、真のthats。 –

+0

ええ、私は私の元の質問でこれを言いました。これは最善の解決策ですか、もしそうなら、なぜですか?選択肢はありますか?私が思う – GoldenJoe

関連する問題