2015-10-14 1 views
0

Quand je fais une requête SELECT 1*7.6, Il me gaves 7.6MySQL Multiplication des colonnes flottantes: 1 * 7.6 donne 7.599999904632568?

Mais quand je fais la multiplication de colonne (* products.commision de sold.amount):

SELECT *, 
(products.commision*sold.amount) as fee 
FROM sold 
RIGHT JOIN products 
ON sold.idprod=products.ID 
AND DATE(sold.date) BETWEEN DATE('2015-10-01') AND DATE('2015-10-31') 
WHERE sold.userid="1" 
ORDER BY sold.userid 

Il me gaves

ID | userid | date  | idprod | amount | Category | Name | commision | fee 
60 | 1  | 15-10-01 | 21  | 1  | Volish | Black | 7.6(float) | 7.599999904632568 

Pourquoi?

+3

Vous utilisez des colonnes flottantes. Decimal (19,6) est probablement ce que vous cherchez .... – Edward

+0

Probablement parce que 'products.commission' n'est pas exactement' 1' ou 'vendu.amount' n'est pas exactement' 7.6', mais soit la valeur sur son propre est assez proche pour être affiché en tant que tel. Les nombres à virgule flottante sont difficiles. –

+0

@Edward Je ne comprends pas? –

Répondre

0

Vous aurait pour saisir les valeurs de coulée sous forme d'entiers/Décimales plutôt que comme des flotteurs lors de la comparaison de sorte

(CAST(products.commision AS Decimal(7,2)) * CAST(sold.amount AS Decimal(7,2))) as fee 

de https://dev.mysql.com/doc/refman/5.0/en/cast-functions.html et casting a floating to decimal in mysql

La décimale définit la valeur décimale avec les 7 chiffres de la taille maximale et les 2 chiffres de la précision maximale (12345,67)

edit: Je ne suis pas sûr si son plus efficace pour ajouter le CAST pour les valeurs brutes ou pour simplement émettre la réponse telle que

(products.commision * sold.amount) as CAST(fee AS Decimal(7,2)) 
+0

oh merci, je pensais que je devais changer les types de colonnes –

+0

changer de type de colonne est probablement meilleure stratégie globale, mais vous pouvez changer ces choses dans la requête si c'est un problème isolé. – Martin

+0

encore une question, si j'ai 17,56 c'est 17,56, mais quand j'ai 18,00 je le veux juste 18. comment puis-je le faire? –

0

Merci pour l'aide dans les commentaires,

Solution

Float est binaire et décimal est ... décimal, donc je changé mes colonnes en décimal (16,9)