Yii2 меньше, чем оценивается как истина при равных

У меня есть функция, чтобы проверить, если значение атрибута меньше, чем другое:

public function getFnGminGrFnotKlFnut() {
if ($this->FnGmin) {
return $this->FnGmin > $this->fnot || $this->FnGmin < $this->fnut ? ['class' => 'danger'] : [];
} else {
return [];
}
}

Посмотреть:

[
'attribute' => 'FnGmin',
'contentOptions' => function ($model) {return $model->fnGminGrFnotKlFnut;},
],

$this->FnGmin < $this->fnut однако, если я печатаю значения, они равны. Например. FnGmin = 8.37 а также fnut = 8.37 И его красный! Однако иногда функция возвращает правильную оценку! От FnGmin = 8.38 а также fnut = 8.38 это не красный! Больше нет скрытых десятичных разрядов и округлений. Что здесь происходит? Не могли бы вы мне помочь? Я был бы очень признателен за это!

1

Решение

Я думаю, это из-за точности с плавающей точкой php. Я думаю, вы рассчитали некоторые используемые значения.

например:

$x = 8 - 6.4;  // which is equal to 1.6
$y = 1.6;
var_dump($x == $y); // is not true
//PHP thinks that 1.6 (coming from a difference) is not equal to 1.6. To make it work, use round()
var_dump(round($x, 2) == round($y, 2)); // this is true

уже есть несколько ответов:

PHP — Получение внутренней переменной с плавающей запятой

Установить точность для числа с плавающей точкой в ​​PHP

В вашем случае используйте что-то вроде этого:

// set some wanted floating point precision which is higher that your used float numbers e.g. 3
$precision = 3;return round($this->FnGmin, $precision) > round($this->fnot, $precision)  || round($this->FnGmin, $precision)  < round($this->fnut, $precision) ? ['class' => 'danger'] : [];
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector