Yii2: проблемы с запросом findOne для значения с плавающей запятой

0

Имя поля базы данных с положением типа данных value float(5,2)

Inserted value
7.80
78.00

Мой запрос в модальном

$checkValue = static::find()->where(['value' => $this->value])->one();

Если я передал $this->value равное 78,00 или 78,000, тогда он возвращает правильный результат.

Но если я передаю 7.80 или 7.8, тогда возвращаются 0 строк. Зачем?

  • 0
    Что происходит, когда $ this-> value является строкой '7.80' ?
  • 0
    Это даст мне 0 результат, если я передал его в строке. Его работа с как запрос ....
Показать ещё 4 комментария
Теги:
yii2

2 ответа

0

Я разрешаю эту проблему с двойным типом данных

value double(5,2)
0

я подозреваю, что внутренне mysql рассматривает 7.8 как нечто вроде 7.800000000001 поэтому вы не можете получить результат, если вы сравниваете его с фиксированным значением.

вы, возможно, столкнулись с справочными руководствами mysql по типам данных.
обратите внимание на следующее:

MySQL допускает нестандартный синтаксис: FLOAT (M, D) или REAL (M, D) или DOUBLE PRECISION (M, D). Здесь (M, D) означает, что значения могут быть сохранены с суммой до M цифр, из которых D цифр могут быть после десятичной точки. Например, столбец, определенный как FLOAT (7,4), будет отображаться как -999.9999 при отображении. MySQL выполняет округление при сохранении значений, поэтому, если вы вставляете 999.00009 в столбец FLOAT (7,4), приблизительный результат равен 999.0001.

Поскольку значения с плавающей запятой являются приблизительными и не сохраняются в виде точных значений, попытки рассматривать их как точные в сравнении могут привести к проблемам. Они также зависят от зависимостей платформы или реализации. Для получения дополнительной информации см. Раздел B.5.4.8, "Проблемы с значениями с плавающей запятой"

Для максимальной переносимости код, требующий хранения приблизительных значений числовых данных, должен использовать FLOAT или DOUBLE PRECISION без указания точности или количества цифр.


для большинства приложений вы можете безопасно использовать тип фиксированной точки.
по существу используя decimal(5,2) вместо float(5,2) гарантирующую, что любое отображаемое значение является точным значением, хранящимся внутри.
когда это применимо, округление происходит при вставке с правилом "round half up" до указанной вами точности и несколько более интуитивно понятным и простым в управлении

Ещё вопросы

Сообщество Overcoder
Наверх
Меню