не может сравнить две пары с PHP - PullRequest
0 голосов
/ 29 января 2012

Я хочу найти кратчайшее расстояние в моей базе данных.$ this-> tobiMeasure ($ question, $ row ["question"]);возвращает число, которое вы можете увидеть внизу этого поста.

$compDistance = 10.0;
$bestDistance = 10.0;
$bestQuestion = "";

while ($row = $result->fetch_assoc())
{
    $compDistance = $this->tobiMeasure($question, $row["question"]);
    if($compDistance <= $bestDistance);
    {
        print $compDistance." < ".$bestDistance.", ";
        $bestDistance = $compDistance;
        $bestQuestion = $row["question"];
    }
}

$mysqli->close();
return $bestQuestion." : ".$bestDistance;

Я вставил функцию печати, чтобы проверить истинные значения.И здесь проблема.Сравнение неверно, но я не знаю почему.

Это вывод функции печати:

0,98151939273405 <10, 0,98151939273405 <0,98151939273405, 0 <0,98151939273405, 0,86200787113796 <0,+0,89754831644548 <+0,86200787113796, +0,92562573652942 <+0,89754831644548, 1 <+0,92562573652942, 1 <1, +0,9925897779704 <1, 1 <+0,9925897779704, 1 <1, +0,9925897779704 <1, +0,99433274544623 <+0,9925897779704, +0,9950801111188 <+0,99433274544623, +0,99699990676577 <+0,9950801111188, +0,99699990676577 <+0,99699990676577, +0,9968522683665 <+0,99699990676577, +0,99905782526423 <+0,9968522683665, +0,98744920090422 <+0,99905782526423, +0,98708917521662 <+0,98744920090422, +0,99162758425298 <+0,98708917521662, 1 <+0,99162758425298, * 1 008 * * * 1009 Например, последний.Почему 1 меньше 0,99 ...? </p>

Ответы [ 3 ]

2 голосов
/ 29 января 2012

PHP (и любой другой язык) не очень хороши при сравнении чисел с такой точностью. Возможно, вам стоит подумать об использовании bccomp. (Я не знаю, почему 1 меньше, чем ваши примеры. Это не должно быть одной из странностей, с которыми вы ожидаете столкнуться).

http://www.php.net/manual/en/function.bccomp.php

Чтобы взять наглядный пример, мы, люди, можем довольно легко представить числа фракталов. 1/3 + 1/3 + 1/3 = 1. Попробуйте рассказать об этом компьютеру! Вот почему вы часто получаете странные округления чисел.

Вы всегда можете определить, есть ли у вас проблема с округлением, если попытаться вычислить e до pi Минус pi . <<em> / хихикает >

1 голос
/ 29 января 2012

Вы должны удалить ; в конце этой строки:

if($compDistance <= $bestDistance);

На данный момент он изменит каждое значение на лучшее расстояние.

Также см. Исправленный пример .

0 голосов
/ 29 января 2012

Мы не можем сравнивать числа с плавающей запятой (также известные как «числа с плавающей запятой», «двойные» или «действительные числа») с помощью оператора ==.

Числа с плавающей точкой имеют ограниченную точность

Мы должны проверить равенство, используя что-то вроде:

if(abs($a - $b) < 0.0001) {
    echo "Compared Floats are Equal";
} 

Надеюсь, это поможет:)

...