mam dwa pola do przechowywania danych geolokalizacyjnych, zdefiniowanych jako podwaja w mojej bazy danych MySQL:Dziwna zmiana wartości podczas zapisywania danych podwójnego typu (geolokalizacji) do bazy
`address_geo_latitude` float(10,6) NOT NULL,
`address_geo_longitude` float(10,6) NOT NULL
i używam Yii2 użytkownika double
walidator na wartości przekazywane przez użytkownika:
public function rules()
{
return [
[['address_geo_latitude', 'address_geo_longitude'], 'double', 'min'=>0, 'max'=>360]
];
}
(chociaż moje badania wydaje się być udowodnienie, że kwestia ta nie ma nic wspólnego z walidatorami Yii2)
podczas testów I'v e zaobserwować dziwne zmiany wartości, to jest (?):
359.90
staje359.899994
(0,000006
różnica),359.80
staje359.799988
(0,000012
różnica),311.11
staje311.109985
(0,000015
różnica),255.55
staje się255.550003
(-0,000003
różnica),- się
205.205002
(-0,000002
różnicy), 105.105
się105.105003
(-0,000003
różnica).
ale:
359.899994
pozostaje359.899994
,311.109985
pozostaje311.109985
,311
pozostaje311
,255
pozostaje255
,200
pozostałości200
,75.75
pozostaje75.75
,11.11
pozostaje11.11
.
Czego mi brakuje? Nie widzę żadnego wzoru ani logiki za nimi.
Czy to dlatego, że mam niepoprawną deklarację pola MySQL dla tego rodzaju danych? Jeśli tak, to jaki jest właściwy? Kilka różnych odpowiedzi:
- Database/SQL: How to store longitude/latitude data?
- What datatype to use when storing latitude and longitude data in SQL databases?
- What is the ideal data type to use when storing latitude/longitudes in a MySQL database?
wskazuje, że za pomocą float(10,6)
jest najlepszym rozwiązaniem, jeśli nie przy użyciu MySQL spatial extensions.
moich testów wydaje się być udowodnienie, że kwestia ta nie ma nic wspólnego z walidatorami Yii2, ponieważ wartość pozostaje poprawna aż ponownie odczytane z bazy danych:
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!
}
Moje pytanie jest sprzeczny this one. Moje numery: zyskują, nie tracę, dokładność! I tylko dla pewnych liczb, nie zawsze.
Czy wartości są poprawne w * mysql * po ponownym zapisaniu? – Tony
@ Tony Niestety, nie rozumiem twojego pytania, ponieważ nigdy nie powiedziałem nic o drugim zapisie, tylko o drugim czytaniu (ponownym przeczytaniu). Tak, natychmiast po zapisaniu '$ model-> save()' jako '$ model-> address_geo_latitude = 311.11' okazuje się faktycznie przechowywać/ma wartość' 311.109985' w kolumnie 'address_geo_latitude'. – trejder