0

データベースにお金をbigint列として保存するプロジェクトがあります(セントで保存)。代わりに BCMATH を使用するようにこれを書き直す予定です。私は整数を気にしませんが、セントで保存されたいくつかのひどい丸め誤差イベントを与えてくれます.BCMATHでも同じ丸め誤差があるのではないかと思います. 問題は、次の疑似コードのような状況で発生します。

$price = $some_price_in_cents * $store_price_increase; // second value is a float for final price calculation, so the result might have fractions of a cent
$price_total = $price * $qty;
$discount = // some discount in cents (might have fractions of a cent)
$discount *= $qty;
$discounted_price = $price_total - $discount;

データベースに挿入するときは、セント単位のすべての値に対して round() を実行します。そして今、私は次のような記録を持っています:

total price = 12134
discount = 460
discounted price = 11675

ここで 12134 - 460 を実行すると ... 明らかに 11675 ではなく 11674 が得られます。また、計算方法を変更した場合 (たとえば、最後にすべてに QTY を掛ける)、さらに異なる結果が得られるのではないかと思います。 .

BCMATH を使用すると、この種の動作が発生しますか? 結果は数学演算の順序に依存しますか? BCMATH を使用して上記を適切に計算し、DB に格納するにはどうすればよいでしょうか (小数点以下 2 桁が必要であると仮定します)。

4

1 に答える 1

2

私はこれがあなたが必要としているものだと信じています。bcmath には文字列が必要であることに注意してください。数値 2 は、必要な小数点以下の桁数を指定するためのものです。

$price = bcmul($some_price_in_cents, $store_price_increase, 2);
$price_total = bcmul($price, $qty, 2);
$discount = bcmul($qty, "discount amount", 2);
$discounted_price = bcsub($price_total, $discount, 2);
于 2013-12-17T14:42:06.053 に答える