php сравнивает числа с плавающей запятой со значением поля ввода - PullRequest
0 голосов
/ 14 мая 2011

У меня есть форма, в которой пользователи могут вводить значения с плавающей запятой.Я публикую эти значения в php-скрипте и сравниваю, совпадают ли числа, введенные пользователями, с некоторыми значениями.Если я оставлю целое число, сравнение вернет true независимо от того, превысило ли число границы.Если я ввожу число с плавающей запятой, сравнение не будет выполнено независимо от того, находится ли число в границах.Я не глуп, я сделал сравнения с плавающей запятой в C ++, и я знаю, как сделать, если (float1> = float2) возвращает false ...

вот мой код:

//loading the helper
$val = Loader::helper('synerciel_form','synerciel_client');
//adding the fields to the inputs array for validation
$val->between('isolation_des_murs_peripheriques', 2.8, null, t($between.'Isolation des murs 
pèriphèriques'), true, false);

// вспомогательный класс

class SynercielFormHelper extends ValidationFormHelper {
    const VALID_BETWEEN = 7;
    const VALID_FLOAT = 7;
    private $min;
    private $max;
    private $includeLow;
    private $includeHigh;

 public function between($field, $min, $max, $errorMsg, $includeLow = true, $includeHigh = true) {
        $const = SynercielFormHelper::VALID_BETWEEN;
        $this->min = $min;
        $this->max = $max;
        $this->includeLow = $includeLow;
        $this->includeHigh = $includeHigh;

        $this->addRequired($field, $errorMsg, $const);
    }
   ...
   public function test() {

    $between = new ValidationNumbersBetweenHelper();
    if (!$between->between($this->data[$field], $this->min, $this->max, $this->includeLow, $this->includeHigh)) {
                        $this->fieldsInvalid[] = $f;
}

}

Мой метод проверки (я считаю, что это сложная часть)

class ValidationNumbersBetweenHelper {

    public function between($data, $min = null, $max = null, $includeLow = true, $includeHigh = true) {

        if ($min && $includeLow) {
            if (!($data >= $min))
                return false;
        } else if ($min) {
            if (!($data > $min))
                return false;
        }
        if ($max && $includeHigh) {
            if (!($data <= $max))
                return false;
        } else if ($max) {
            if (!($data < $max))
                return false;
        }
        return true;
    }

}

Ответы [ 2 ]

0 голосов
/ 24 июля 2012

Попробуйте выделить проблемный код.Поместите вашу функцию проверки в отдельный PHP-файл и протестируйте ее там.Попробуйте проверить $max и $min для !== null, так как 0 также false.Вы можете изменить логику и удалить все ! с.(например, измените >= на <), поэтому вместо "не больше или равно" вы можете иметь "меньше"

0 голосов
/ 07 июня 2011

Проверьте предупреждение http://php.net/manual/en/language.operators.comparison.php

Вы можете использовать математические функции BC http://php.net/manual/en/function.bccomp.php

$status = bccomp($left, $right);
if ($status == 0) {
    echo 'equal';
} else if ($status > 0) {
    echo 'left bigger than right';
} else {
   echo 'right bigger than left';
}

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

...