sql >> データベース >  >> RDS >> Mysql

MySQLとPHPの小数点以下の精度が間違っています

    Authorize.Net用に書いた記事

    1プラス1は2に等しいですよね? .2プラス1.4×10はどうですか?それは16に等しいですよね? PHP(または他のほとんどのプログラミング言語)で数学をしている場合は違います:

    echo floor((0.2 + 1.4) * 10); // Should be 16. But it's 15!
    

    これは、浮動小数点数が内部でどのように処理されるかによるものです。それらは小数点以下の桁数が固定されて表され、期待どおりに合計されない数値になる可能性があります。内部的には、.2 + 1.4 x 10の例は、およそ15.9999999998程度に計算されます。この種の計算は、パーセンテージのように正確である必要のない数値を処理する場合に適しています。しかし、お金を使って作業する場合、1セント硬貨や1ドルがここかそこかで不足していることが重要であり、すぐに合計され、不足しているお金の不足分にいることを好む人は誰もいません。

    BC数学ソリューション

    幸い、PHPはBCMath拡張機能 を提供しています。 これは、「任意精度の数学のために、PHPは、文字列として表される任意のサイズと精度の数値をサポートするBinaryCalculatorを提供します。」つまり、この拡張機能を使用して、金銭的価値を使用して正確な計算を行うことができます。 BCMath拡張機能には関数が含まれています加算> 、減算乗算 、および部門

    より良い例

    上記と同じ例ですが、bcadd()関数を使用して計算を行います。 3つのパラメータを取ります。最初の2つは追加したい値で、3番目は正確にしたい小数点以下の桁数です。お金を使って作業しているので、精度を小数点以下2桁に設定します。

    echo floor(bcadd('0.2', '1.4', 2) * 10); // It's 16 like we would expect it to be.
    


    1. OracleSQLのカスタムオーダー

    2. SQL:2つの日付の違い

    3. PostgreSQLのフォールトトレランスの進化

    4. NodeJSとmysql:クエリ結果を待つ