ホームページ >バックエンド開発 >PHPの問題 >php json_encode の精度の損失について話しましょう

php json_encode の精度の損失について話しましょう

PHPz
PHPzオリジナル
2023-03-29 10:09:451151ブラウズ

PHP は、Web アプリケーションの作成、データベースの処理、スクリプトの作成、およびサーバーサイド プログラミングに広く使用されているプログラミング言語です。その中でも、json_encode は PHP で非常に一般的な関数で、PHP の配列とオブジェクトを JSON 文字列に変換するために使用されます。この関数は非常に便利なツールであり、日常のプログラミングで非常に頻繁に使用されます。ただし、json_encode 関数を使用して PHP 配列またはオブジェクトを JSON 文字列に変換すると、精度が失われることがあります。この記事では、この問題の原因を探ります。

まず、JSON とは何かを理解しましょう。 JSON (JavaScript Object Notation) は、データ交換に使用されるテキスト形式です。非常に軽量な形式で、読みやすく理解しやすいです。 JSON 形式はキーと値のペアで構成されており、これらのキーと値のペアには配列やネストされたオブジェクトを含めることもできます。 PHP の場合、 json_encode 関数を使用して配列とオブジェクトを JSON 形式の文字列に変換し、 json_decode 関数を使用して JSON 形式の文字列を PHP 配列またはオブジェクトに変換できます。

では、変換に json_encode 関数を使用すると、なぜ精度の低下が発生するのでしょうか?これは、浮動小数点数を処理するときの json_encode 関数のメカニズムが原因で発生します。 PHP では、浮動小数点数は通常、IEEE 754 標準の倍精度浮動小数点形式で表されます。 JSON 形式では、浮動小数点数の表現方法は 10 進数表現の 1 つだけです。 PHP 配列またはオブジェクトに倍精度浮動小数点データが含まれている場合、json_encode 関数はそれを JSON 文字列に変換するときに精度の低下を引き起こし、結果として精度が失われます。

次は、この問題を説明する簡単な例です:

$array = array(
    'foo' => 0.1,
    'bar' => 0.7,
    'baz' => 0.6 + 0.1
);

echo json_encode($array);

出力結果は次のとおりです:

{"foo":0.1,"bar":0.69999999999999996,"baz":0.7}

ご覧のとおり、$array 配列には 3 つの浮動小数点数が含まれています。タイプ データは、いずれかの数値が 0.6 0.1 ですが、json_encode 関数の変換時に 0.7 に変換され、精度が失われるという問題が発生します。他の浮動小数点タイプのデータでも同じ問題が発生します。

それでは、この問題をどうやって解決すればいいのでしょうか?通常、次の 2 つの方法があります:

1.number_format 関数を使用して浮動小数点数を丸めます:

$array = array(
    'foo' => number_format(0.1, 2, '.', ''),
    'bar' => number_format(0.7, 2, '.', ''),
    'baz' => number_format(0.6 + 0.1, 2, '.', '')
);

echo json_encode($array);

出力結果は次のとおりです:

{"foo":"0.10","bar":"0.70","baz":"0.70"}

number_format 関数を使用して浮動小数点数を丸めますポイント番号を使用すると、精度損失の問題を解決できます。ただし、このアプローチは洗練されておらず、浮動小数点数ごとに処理が必要です。

2. bcmath 拡張関数を使用して浮動小数点数を処理します:

if (!function_exists('json_encode_float')) {
    function json_encode_float($val) {
        $precision = ini_get('precision');
        ini_set('precision', 16);
        $encoded = json_encode($val);
        ini_set('precision', $precision);
        return $encoded;
    }
}

$array = array(
    'foo' => 0.1,
    'bar' => 0.7,
    'baz' => 0.6 + 0.1
);

echo json_encode_float($array);

出力結果は次のとおりです:

{"foo":0.1,"bar":0.7,"baz":0.7}

bcmath 拡張関数を使用すると、精度を設定できますより高い値に設定すると、精度の低下の問題が回避されます。コード内の json_encode_float 関数は、json_encode 関数のカプセル化であり、浮動小数点型のデータを処理するために使用されます。

要約すると、json_encode 関数の精度損失の問題は、浮動小数点数を処理するときのメカニズムが原因で発生します。精度の低下を避けるために、number_format 関数を使用して浮動小数点数を丸めるか、bcmath 拡張関数を使用して浮動小数点数を処理できます。日常のプログラミングでは、この問題に注意し、精度の低下を避けるために適切な方法を採用する必要があります。

以上がphp json_encode の精度の損失について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。