web-dev-qa-db-fra.com

Sélection d'un float dans MySQL

J'essaie de faire une correspondance SELECT sur une table en fonction d'un identifiant et d'un prix, tels que:

SELECT * FROM `table` WHERE `ident`='ident23' AND `price`='101.31';

Ce qui précède ne renvoie aucune ligne, tandis que si vous supprimez le bit price='101.31', il renvoie la ligne correcte. 

Faire un ...

SELECT * FROM `table`;

Renvoie la même ligne que ci-dessus et indique très clairement que price='101.31'. Pourtant, sélectionner ne correspond pas. Changer = en <= le fait fonctionner - mais ce n'est pas exactement une solution.

Existe-t-il un moyen de convertir le flottant MySQL en deux chiffres avant que l'opération ne soit effectuée, rendant ainsi la SELECT ci-dessus fonctionnelle (ou une autre solution)?

Merci!

22
Meep3D

Couler en décimale a fonctionné pour moi:

SELECT * FROM table WHERE CAST(price AS DECIMAL) = CAST(101.31 AS DECIMAL);

Cependant, vous voudrez peut-être simplement commencer par transformer la colonne price en DECIMAL. DECIMAL est généralement considéré comme le meilleur type à utiliser pour traiter les valeurs monétaires.

38
Matt Solnit

Cela ne fonctionne pas car un float est intrinsèquement imprécis. La valeur réelle est probablement quelque chose comme '101.3100000000001'. Vous pouvez d'abord utiliser ROUND () pour l'arrondir à 2 endroits ou, mieux encore, utiliser un type DECIMAL au lieu d'un float.

11
Eric Petroelje

N'utilisez jamais de flotteurs pour de l'argent.

9
jcdyer

Aujourd'hui, je suis également tombé dans la même situation et je résous en utilisant simplement la fonction FORMAT de MySQL. Il renverra les résultats qui correspondent exactement à votre clause WHERE.

SELECT * FROM yourtable WHERE FORMAT(col,2) = FORMAT(value,2)

Explication: FORMAT('col name', precision of floating point number)

7
hmasif

Essayez ceci: SELECT * FROM table WHERE prix comme 101.31 ;

0
Gerson Diniz

Je cherchais une solution, mais finalement je l’ai fait en utilisant mon précédent php number_format (), qui était venu voir la solution de @ hmasif.

Utilisez ceci et vous obtiendrez votre correspondance float - mysql:

$floatmatch = number_format((float)$yourfloatvariable,5);

où 5 est cinq chaînes du point décimal. par exemple. 7.93643