J'ai ceci dans une table mySQL: p>
p>
Si j'utilise la colonne Cependant, si j'utilise la colonne code> lat code>, il fait les résultats de retour em>: p>
Quel est le problème avec la colonne code> gnongitude code> p> ID code> et
bolag_id code> sont
int code>.
LAT CODE> et
LINGItude code> sont
double code>. p>
LENDIUDE CODE>, aucun résultat n'est renvoyé: p>
Lngtitude Code> Query: strong>
Sélectionnez * à partir de location_forslag où Code> Lngtitude
= 13.8461208 Code> P>
DAT code> Query: strong>
Sélectionnez * à partir de location_forslag où code> lat
= 58.3902782 code> p> p> P> P>
3 Réponses :
Les points flottants sont irritants .. ..
WHERE ABS(lngitude - 13.8461208) < 0.00000005
Cela fonctionne. C'est donc une coïncidence que cela a fonctionné avec l'autre colonne? Puis-je stocker cela dans un meilleur type de données?
Un type de données code> Decimal code> est exact dans les versions MySQL récentes, voir le lien.
Le type de données est bien, le problème est que la signification de «égale» dépend de la demande - dans le monde réel, il n'y a rien de tel. Dans une application SATNAV, l'égalité peut être "à moins de 10 mètres". Pour une base de données de registre foncier "à 0,05 mètre" pourrait être suffisamment bonne. Construire une cuisine, il pourrait être "à 5 mm".
@Wrikken: cela peut empêcher les indices d'être utilisés.
@Ben: bon point. Bien qu'il soit plus court pour écrire mon chemin, votre chemin pourrait utiliser des index et pour être honnête, la requête fonctionnera probablement plus de fois que le code est écrit (ce qui n'est qu'une fois, si cela est fait correctement;))
Ce n'est généralement pas une bonne idée de comparer les numéros de points flottants avec = code> Equals Opérateur.
L'utilisation du SQL entre le mot clé n'est pas mauvais dans ce cas (imo plus lisible).
Que diriez-vous d'utiliser gnond code> comme 13.8461208? Cela pourrait-il être une solution?
@Lille_skutt: Non, vous devez prendre une décision délibérée quelle précision que vous voulez et vos comparaisons explicitement. La base de données n'a rien à vous aider ici - sauf si vous avez installé certaines extensions SIG.
@Ben Okey, mais je trouve ce joli étrange que vous ne pouvez pas comparer un numéro au même numéro. Quelle est la base de la base de données MySQL peut-elle être au plus? La valeur que je l'envoie sera toujours exactement la même que celle de celle-ci.
@ Ce n'est pas le même numéro. 13.8461208 n'est probablement pas un nombre dyadique (aucune représentation finie dans la base 2) car 1/3 n'est pas un nombre décimal. Lorsqu'un ordinateur traduit ce qui est stocké en format binaire à une représentation décimale pour vous et lorsque vous fournissez cette représentation basée sur 10 à l'ordinateur, laissez-le traduire NI Base 2, il peut y avoir des pertes de précision.
@Benoit je vois. Mais comment puis-je savoir avec certitude ce que cette perte de précision peut être au plus?
Convertir le flotteur en décimal pour comparer. J'ai eu le même problème et j'ai résolu comme ceci: regarde les 3 premières lignes après la clausule.
J'espère que cela aide. P> p>
Essayez
où la gravité entre 13.8461208 et 13.8461209 code>.
@Benoit fonctionne si je le change à 13.8461207 et 13.8461208