2

PHPコードの構成変数に保存される価格と割引額がいくつかあります。それらを文字列として保存する必要があるかどうか疑問に思っています。

たとえば、次のことを行っても安全ですか?

$price = 14.95;
$volume_discount = 0.3;

または文字列として保存する必要がありますか?

$price = '14.95';
$volume_discount = '0.3';

BC Math を使用しない限り、浮動小数点数を比較したり、浮動小数点数を使用して計算を行ったりすると、予期しない結果が生じる可能性があることはわかっています。しかし、保存された値をそのまま印刷することについて疑問に思っています。フロートバージョンをエコーし​​てみましたが、期待どおりに表示されましたが、それが信頼できるかどうか疑問に思っています。

: 私は、素人が何を期待するかを説明するために、期待されるという用語を使用しました。Eric が指摘するように、正確な 10 進浮動小数点数は実際には期待される結果ではありません。

編集: 現時点で関心のあるコードは、数量をチェックし、割引を適用するかどうかを決定します。次に、次の計算を行います。

$price -= round($price * $volume_discount, 2);

私は通常number_format、表示用に価格をフォーマットするために使用しますが、テスト用にフォーマットをコメントアウトしました。これまでのところ、価格や割引の値に関係なく、PHP は望ましい結果をもたらしてくれました。ただし、JavaScript を使用しても必ずしも望ましい結果が得られるとは限りません。それが、私の PHP コードをもう一度見直すきっかけになりました。

明らかに、エラーが表示される JavaScript を調整しますが、PHP コードをリファクタリングする必要があるかどうかを判断しようとしていました。

問題を説明した数字は 149.95 * 0.3 でした。PHP は 44.985 を表示し、JavaScript は 44.98499999999999 を表示します。そのため、小数点以下 2 桁に丸めた後でも、異なる数値が得られます。

4

1 に答える 1

2

10 進数の「14.95」を解釈して 2 進浮動小数点オブジェクトに格納するには、浮動小数点操作が必要です。10 進浮動小数点から 2 進浮動小数点への変換です。したがって、これは浮動小数点演算であり、丸め誤差の影響を受けます。

この変換は、ソース テキストがコンパイラまたはインタープリターによって解釈されるとき、または実行時に発生する可能性がありますが、実際に発生し、丸め誤差の影響を受けます。

(あなたの質問は、浮動小数点数を比較して計算すると予期しない結果が生じると主張しています。これは、操作がそれらの操作の仕様に従うことを期待していない場合にのみ当てはまります。仕様を学習し、したがって何をすべきかを学習することで、予期しない結果を回避できます。予想。)

于 2013-02-18T05:27:17.473 に答える