3

私はクライアントのプロジェクトに取り組んでいますが、それは非常に単純です。しかし、私がしなければならない計算が 1 つあります。これも非常に単純です。次の例のようになります。

$a = (49.95 - 24.95);
if ($a == 25.00) {
    echo "TRUE";
} 

これは 25.00 です。しかし、それはfalseを返しませんか???

しかし、これを行うと、必要な計算に似た別の例:

$a = (99.95 - 24.95);
if ($a == 75.00) {
    echo "TRUE";
}

それから私は真実になります!私は怒っていますか、それともこれはバグですか?

4

4 に答える 4

2

マニュアルで読めるように、float を直接比較しないでください。代わりに を使用しますepsilon

<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;

if(abs($a-$b) < $epsilon) {
    echo "true";
}

これは、PHP が内部的にフロートを格納する方法によるものです。それについては、マニュアルで読むことができます。ここhttp://pl1.php.net/float

于 2013-10-10T12:25:17.870 に答える
2

バグではありません。浮動小数点数の精度についてです。==浮動小数点数は 10 進数の精度で格納されるため、 (等価比較)のような正確な比較操作に依存することはできません。

代わりに、精度デルタを使用して、次のように浮動小数点数を比較する必要があります。

$a = (49.95 - 24.95);
$b = 25;
$delta = 1E-13;

if(abs($a-$b)<$delta)
{
   echo('TRUE');
}

PHP では、精度デルタとして使用するには 1E-13 で十分です。非常に簡単な説明については、浮動小数点数とその表現に関するこのガイドを参照してください。

于 2013-10-10T12:26:25.947 に答える
1
$a = (49.95 - 24.95);
if ((int)$a == 25) {
    echo "TRUE";
}
于 2013-10-10T12:34:37.330 に答える
0

最初の例では int 数と比較される float 数があり、2 番目の例では float 数と比較される float 数があります。違いは浮動小数点の精度が原因で発生し、バグではありません。

これを解決するためd (delta)に、計算の精度となる数値を定義できます

次に、絶対結果がx-y定義した精度よりも低くなるかどうかを確認できます。このようなものif(abs(x-y) < d)

于 2013-10-10T12:34:54.187 に答える