【问题标题】:Yii2: problems with findOne query on float valueYii2:findOne 查询浮点值的问题
【发布时间】:2018-01-17 13:24:58
【问题描述】:

数据类型为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 行。为什么?

【问题讨论】:

  • 当 $this->value 是 string '7.80' 时会发生什么?
  • 如果我在字符串中传递它会给我 0 结果。它适用于类似查询....
  • 可以直接查数据库吗?
  • 是的,在数据​​库查询中它工作正常 SELECT * FROM value_master WHERE value=7.8
  • Yii 为unsigned 整数和floating 数字返回字符串。那是因为通常DBMS 类型可以表示比PHP 更多,并且我们希望保持精度。 stackoverflow.com/questions/37840490/…

标签: mysql yii2


【解决方案1】:

我怀疑内部 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, “Problems with Floating-Point Values” 部分

为了获得最大的可移植性,需要存储近似数值数据值的代码应使用 FLOAT 或 DOUBLE PRECISION,不指定精度或位数。


对于大多数应用程序,您可以安全地使用fixed point type。
基本上使用 decimal(5,2) 而不是 float(5,2) 确保显示的任何值都是内部存储的确切值。
当适用的舍入发生在插入时,使用“向上舍入”规则达到您指定的精度,并且更直观且易于管理

【讨论】:

    【解决方案2】:

    我用双数据类型解决了这个问题

    value double(5,2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 2021-12-17
      • 2014-11-22
      相关资源
      最近更新 更多