Yii2:findOne查询浮点值的问题

时间:2018-01-17 13:24:58

标签: mysql yii2

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

2 个答案:

答案 0 :(得分: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, “Problems with Floating-Point Values”部分

     

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

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

答案 1 :(得分:0)

我使用double数据类型

解决了这个问题
value double(5,2)