gpt4 book ai didi

mysql - 将双类型数据(地理定位)保存到数据库时发生奇怪的(?)值变化

转载 作者:可可西里 更新时间:2023-11-01 07:08:05 24 4
gpt4 key购买 nike

我有两个字段用于存储地理位置数据,在我的 MySQL 数据库中定义为 double :

`address_geo_latitude` float(10,6) NOT NULL,
`address_geo_longitude` float(10,6) NOT NULL

我正在使用 Yii2 的 double 验证器来验证用户传递的值:

public function rules()
{
return [
[['address_geo_latitude', 'address_geo_longitude'], 'double', 'min'=>0, 'max'=>360]
];
}

(虽然我的测试似乎证明,这个问题与 Yii2 验证器无关)

在测试期间,我观察到值的奇怪(?)变化,即:

  • 359.90 变为 359.899994(0,000006 差异),
  • 359.80 变为 359.799988(0,000012 差异),
  • 311.11 变为 311.109985(0,000015 差异),
  • 255.55 变为 255.550003(-0,000003 差异),
  • 205.205 变成205.205002(-0,000002 区别),
  • 105.105 变为 105.105003(-0,000003 差异)。

但是:

  • 359.899994 仍然是 359.899994,
  • 311.109985 仍然是 311.109985,
  • 311 仍然是 311,
  • 255 仍然是 255
  • 200 仍然是 200,
  • 75.75 保持 75.75,
  • 11.11 仍然是 11.11

我错过了什么?我看不到这些背后的任何模式或逻辑。

这是因为我对这种数据的 MySQL 字段声明不正确吗?如果是,那么正确的是什么?几个不同的答案:

建议,如果不使用 MySQL 的 spatial extensions,使用 float(10,6) 是最好的选择.

我的测试似乎证明,这个问题与 Yii2 验证器无关,因为值在从数据库重新读取之前一直保持正确:

print_r(Yii::$app->request->post()); //Correct!
print_r($lab->address_geo_latitude); //Correct!

if ($lab->load(Yii::$app->request->post(), 'Lab') && $lab->save()) {
print_r($lab->address_geo_latitude); //Correct!

$lab2 = $this->findModel($lab->id);
print_r($lab2->address_geo_latitude); //<-- HERE! Incorrect!
}

我的问题与this one相反.我的数字增加,而不是损失,准确性!并且仅针对某些数字,并非总是如此。

最佳答案

这不是因为 Yii,而是因为浮点值在二进制系统中的存储方式。

正如您在 MySQL documentation 中所读到的那样“浮点值问题”:

Floating-point numbers sometimes cause confusion because they are approximate and not stored as exact values. A floating-point value as written in an SQL statement may not be the same as the value represented internally.

Here you can find the great explanation对于这个问题的例子。如您所见,数字可能会变大、变小或根本不变,但您始终必须记住,这只是一个近似值。

对于地理定位数据,您可以使用简单的 DECIMAL type确保值未更改地存储在数据库中或使用 Spacial Data type优化以存储和查询表示在几何空间中定义的对象的数据。

关于mysql - 将双类型数据(地理定位)保存到数据库时发生奇怪的(?)值变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31114381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com