3

PHPのround()に少し問題があります。私が本当にそれを正しくするかどうかはわかりません。(注文システムです)

$amountは10進数の14,8にすることができます$priceは10進数の10.5にすることができます(データベース内)

現在、次の丸めを使用しています。$priceは1つの$amountに対するものです。

function round_amount($amount) {
  return (float) round($amount, 8);
}

function round_price($amount) {
  return (float) round($amount, 5);
}

//if some one have more decimal chars like 10.000000009
round_amount(10.000000009); //will be 10.00000001

//if some one have more decimal chars like 10.000009
round_price(10.000009); //will be 10.00001

//also this is possible
round_price(round_amount(10.000000009)*round_price(10.000009))

この方法でラウンドを使用するのは正しいですか?一部のユーザーは16を超える小数点以下を使用しています。結果をユーザーデータベースに差し引いたり追加したりしています。

しかし、一部のユーザーは約5〜10セント多すぎます。

これを解決する唯一の方法は、小数点以下8桁と5桁のみを許可することですか?そして、ユーザーがもっと使用しようとした場合、ユーザーに警告しますか?しかし、round_cur(round_amount(10.000000009)* round_cur(10.000009))で問題が発生するよりも

私の丸め方が正しければ、誰かが私が何を意味しているのかを理解してくれるか、教えてくれることを願っています。

$amount = 10.12398413498579889173459873;
$price = 5.1938457198347695;

echo round_cur(round_amount($amount)*round_cur($price))."<br />";
echo round_cur($amount*$price);

//returns
//52.58245
//52.58241

面白い!

4

2 に答える 2

1

データベースからの実際の値をキャッシュしておき、表示用に別の変数を用意してみませんか。このようにして、クリーンな UI を維持しながら、キャッシュされた正しい値に対してすべての計算を実行できます。キャッシュされた変数が更新されるたびに、表示された変数を必ず更新してください。

また、丸めを行う前に常に数学を適用してください。2 つの正確な数値を乗算する方が、2 つの丸められた数値を乗算するよりもはるかに正確です。これは、数学のすべての操作に適用されます。したがって、足し算、引き算、割り算、掛け算、丸めを行いますが、丸めた数値を別の数式に使用しないでください。以前の正確な番号を使用します。

于 2013-04-13T13:12:04.240 に答える
-8

私はあなたのやり方が正しいと思いますが、あなたが言ったようにあなたの状況に応じて、これらの2つの式は異なる値を返し、あなたはプロジェクトのマネージャーとしてどちらのシステムがあなたにとってより良いかを考えるべきです(あなたにとって何が最善であるかを考えるべきです)ユーザーにとって何が最善であり、どちらを選択するかを決定し、どちらを選択するかを確認します)。この状況では、最初の方法をお勧めします

round_price(round_amount(x)*round_price(y))

そして、あなたの問題については、適切な通知または警告が必要です。ユーザーに例を挙げてください。

于 2013-03-01T19:52:28.993 に答える