0

すべての正しい 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 です - それが問題の一部であるかどうかわかりませんか? ただし、サーバーは計算を行う必要がありますよね?

4

0 に答える 0