すべての正しい bcmath 関数を使用して PHP スクリプトを用意し、浮動小数点数の問題を完全に理解してください。私は小数列も使用しています。なぜなら、それらは別のタイプとして保存され、数学はそれらの方が優れているという印象を受けていたからです。
だから私はクエリを持っています: INSERT INTO mytable (identifier, amount) VALUES ('identifer', 'some_number') ON DUPLICATE KEY UPDATE amount = amount + some_number;
基本的に - 行がない場合は挿入し、ある場合は some_number を追加します。
some_number 列は decimal(24,8) です
some_number を 72100312.72872099 に設定してこれを実行し、現在の行が 0.00000000 でゼロになると、列が 72100312.72872100 になる計算になります。
some_number が 72100312.72872098 の場合、正常に動作します。72100312.72872101 であれば問題ありません。11111111.72872099 とすれば問題ありません。
現在の行がゼロではなく、代わりに .00000005 である場合、72100312.72872099 が追加され、合計は予想どおり 72100312.72872104 になります。
数学を台無しにしているようなものです。そして、小数列はこれに影響されないと思いました。
これを修正する方法、またはより良い方法で更新を行う方法はありますか? select、bcadd、そして update を行う必要はありません。このタイプの行 (重複更新時に挿入) は、コード内に約 120 回出現します。それは、選択/bcadd/更新するための多くの改造です。
補遺:5.0より前のMySQLサーバーを数学用の浮動小数点数に変換して読んでください。私は5.5です。5.0未満の問題ではありません。
Edit2: クライアントのバージョンは mysqlnd 5.0.11 です - それが問題の一部であるかどうかわかりませんか? ただし、サーバーは計算を行う必要がありますよね?