6

重複の可能性:
PHP Math Precision PHP
で通貨値を操作するためのベスト プラクティスは?

誰かが助けてくれることを本当に願っています。私はこれでレンガの壁に頭をぶつけてきました。

状況は次のとおりです。割引後の小計を -£11.50 と計算するチェックアウトがあります。次に、11.50 ポンドの配送料を追加して、IMHO が 0 ポンドになるようにします。

ただし、計算が実行されると、float 2.8421709430404E-14 が返されます。

私のデバッグ作業では、これを行いました:

var_dump(
    $build['total'], // float(-11.5)
    $build['delivery'], // float(11.5)
    (($build['total'])+($build['delivery'])) // float(2.8421709430404E-14)
);

ただし、静的計算を行うと:

var_dump((-11.5 + 11.5)); // float(0)

何か案は?

4

1 に答える 1

8

2.8421709430404E-14 は、PHP が出力できるゼロに最も近い (しかし等しくない) 数値です。正確に 0 ではない理由は、浮動小数点数の定義にあります。浮動小数点数は完全に正確というわけではありません。

分数も含む実用的な情報を扱う必要がある場合は、分数を掛けて整数にすることをお勧めします。

したがって、$100.54 は 10054 になります。すべての計算が完了したら、分数に戻すことができます。

例:

$build['total'] = -11.5;
$build['delivery'] = 11.5;

var_dump(
    $build['total'], // float(-11.5)
    $build['delivery'], // float(11.5)
    (int)($build['total']*1000)+(int)($build['delivery']*1000) // int(0)
    (int)(round($build['total'], 4)*1000)+(int)(round($build['delivery'], 4)*1000) // int(0)
);
于 2012-08-16T15:22:56.103 に答える