Ho due campi per la memorizzazione dei dati di geolocalizzazione, definiti come raddoppia nel mio database MySQL:Strano cambiamento valore quando il salvataggio dei dati di tipo doppio (geolocalizzazione) nella base di dati
`address_geo_latitude` float(10,6) NOT NULL,
`address_geo_longitude` float(10,6) NOT NULL
e sto usando Yii2 di double
validatore su valori passati dall'utente:
public function rules()
{
return [
[['address_geo_latitude', 'address_geo_longitude'], 'double', 'min'=>0, 'max'=>360]
];
}
(anche se i miei test sembra essere dimostrando, che la questione non ha nulla a che fare con validatori Yii2)
Durante le prove I'v e ha osservato strani cambiamenti di valori, vale a dire (?):
359.90
diventa359.899994
(0,000006
differenza),359.80
diventa359.799988
(0,000012
differenza),311.11
diventa311.109985
(0,000015
differenza),255.55
diventa255.550003
(-0,000003
differenza),205.205
diventa205.205002
(-0,000002
differenza),105.105
diventa105.105003
(-0,000003
differenza).
ma:
359.899994
rimane359.899994
,311.109985
rimane311.109985
,311
rimane311
,255
rimane255
,200
resti200
,75.75
rimane75.75
,11.11
rimane11.11
.
Cosa mi manca? Non riesco a vedere alcun modello o logica dietro questi.
È questo, perché ho una dichiarazione di campo MySQL errata per questo tipo di dati? Se sì, allora qual è quella corretta? Poche risposte diverse:
- 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?
suggerisce che l'uso float(10,6)
è l'opzione migliore, se non si utilizza MySQL di spatial extensions.
miei test sembra dare i suoi, che la questione non ha nulla a che fare con validatori Yii2, perché il valore rimane corretta fino rileggere dal database:
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!
}
La mia domanda è in contrasto con this one. I miei numeri guadagna, non perde, precisione! E solo per determinati numeri, non sempre.
i valori sono corretti in * mysql * dopo averli salvati di nuovo? – Tony
@Tony Scusa, non capisco la tua domanda, perché non ho mai detto nulla sul secondo salvataggio, solo sulla seconda lettura (riletta). Sì, immediatamente dopo il valore '$ model-> save()' salvato come '$ model-> address_geo_latitude = 311.11' risulta effettivamente memorizzare/avere il valore' 311.109985' nella colonna 'address_geo_latitude'. – trejder