2009-08-19 11 views
21

Je suis en train de faire un match SELECT sur une table basée sur un identifiant et un prix, tels que:Sélection d'un flotteur dans MySQL

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

Les rendements supérieurs à zéro lignes, alors 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 = à <= le fait fonctionner - mais ce n'est pas exactement une solution.

Existe-t-il un moyen de lancer le flottant MySQL à 2 chiffres avant que l'opération ne soit effectuée sur celui-ci, rendant ainsi le travail SELECT ci-dessus (ou une autre solution)?

Merci!

Répondre

35

casting à une décimale a fonctionné pour moi:

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

Cependant, vous pouvez envisager simplement faire la colonne price DECIMAL en premier lieu. DECIMAL est généralement considéré comme le meilleur type à utiliser lorsqu'il s'agit de valeurs monétaires.

+4

note: utilisez 'DECIMAL (M, D)'. 'CAST (101.31 AS DECIMAL) = 101' –

-1

Peut-être quelque chose le long de ces lignes:

SELECT * FROM table WHERE ident='ident23' AND ABS(price - 101.31) < .01; 
11

Il ne fonctionne pas parce qu'un flotteur est intrinsèquement imprécis. La valeur réelle est probablement quelque chose comme '101.3100000000001' Vous pouvez utiliser ROUND() sur le premier pour l'arrondir à 2 endroits, ou mieux encore utiliser un type DECIMAL au lieu d'un flotteur.

8

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

+6

Où puis-je obtenir le changement pour le client? (désolé, un peu d'humour de commerçant là :) – Meep3D

-1

Est-ce que cela fonctionne?

SELECT * , ROUND(price, 2) rounded 
FROM table 
WHERE ident = 'ident23' 
HAVING rounded = 101.31 
6

Aujourd'hui, je suis venu aussi dans la même situation et se résoudre en utilisant simplement la fonction FORMAT de MySQL, il retournera les résultats qui correspondent exactement à la clause WHERE.

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

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

0

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

Utilisez cette page et vous obtiendrez votre flotteur - Match mysql:

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

où 5 est cinq chaînes de la virgule. par exemple. 7.93643

Questions connexes