yii2:findone对float值的查询问题

kb5ga3dv  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(362)

数据类型为的数据库字段名 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行。为什么?
mcdcgff0

mcdcgff01#

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

value double(5,2)
0dxa2lsx

0dxa2lsx2#

我怀疑他有病 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节“浮点值问题”
为了最大限度地提高可移植性,需要存储近似数字数据值的代码应使用浮点或双精度,不指定精度或位数。
对于大多数应用程序,可以安全地使用定点类型。
基本上使用 decimal(5,2) 而不是 float(5,2) 确保显示的任何值都是内部存储的精确值。
在适用的情况下,使用“向上取整”规则对insert进行取整,使其达到您指定的精度,并且更加直观和易于管理

相关问题