MySQL Умножение столбцов с плавающей запятой: 1 * 7,6 дает 7,599999904632568?

Когда я делаю запрос SELECT 1*7.6, он дает мне 7.6

Но когда я делаю умножение столбцов (products.commision * 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

Это дает мне

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

Почему?


person Community    schedule 14.10.2015    source источник
comment
Вы используете столбцы с плавающей запятой. Десятичный (19,6) - это, вероятно, то, что вы ищете ....   -  person Edward    schedule 14.10.2015
comment
Вероятно, потому что products.commission не совсем 1 или sold.amount не совсем 7.6, но любое значение само по себе достаточно близко, чтобы отображаться как таковое. Числа с плавающей запятой сложны.   -  person Mr. Llama    schedule 14.10.2015
comment
@ Эдвард, я не понимаю?   -  person    schedule 14.10.2015
comment
Как правило, деньги ДЕСЯТИЧНЫЕ, а не ПЛАВАЮЩИЕ   -  person Strawberry    schedule 14.10.2015
comment
@ Mr.Llama Это ровно 1 и 7,6, и я должен быть точным   -  person    schedule 14.10.2015
comment
Ваш сервер MySQL работает на 32-битной или 64-битной машине?   -  person Marc Audet    schedule 14.10.2015
comment
@ Strawberry Какая разница? деньги тоже число?   -  person    schedule 14.10.2015
comment
Ой, подождите, я понял, число с плавающей запятой двоичное   -  person    schedule 14.10.2015
comment
хм, я сделал эти столбцы десятичными, но не могу установить комиссию на 7,6? только 7 и 8?   -  person    schedule 14.10.2015
comment
там написано десятичное (10,0)?   -  person    schedule 14.10.2015
comment
Этот ответ Скита - хороший способ понять разницу.   -  person Edward    schedule 14.10.2015
comment
@ Эдвард, я только что прочитал это, теперь я знаю, в чем разница   -  person    schedule 14.10.2015


Ответы (2)


При сравнении вам придется вводить значения как целые / десятичные числа, а не как числа с плавающей запятой, поэтому

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

из https://dev.mysql.com/doc/refman/5.0/en/cast-functions.html и приведение плавающего в десятичное в MySQL

Десятичное число устанавливает значение как десятичное, где 7 цифр - максимальный размер, а 2 цифры - максимальная точность (12345,67).

изменить: я не уверен, что более эффективно добавить CAST к необработанным значениям или просто указать ответ, например

(products.commision  * sold.amount ) as CAST(fee AS Decimal(7,2))
person Martin    schedule 14.10.2015
comment
изменение типов столбцов, вероятно, является лучшей общей стратегией, но вы можете изменить эти параметры в запросе, если это единичная проблема. - person Martin; 14.10.2015
comment
Еще один вопрос, если у меня 17,56, это 17,56, но когда у меня 18,00, я хочу только 18. как мне это сделать? - person ; 14.10.2015
comment
о чем ты говоришь? Где эти числа, в запросе SQL, или в базе данных, или? - person Martin; 14.10.2015
comment
Если у меня комиссия = 7.00, я хочу, чтобы это было 7 - person ; 14.10.2015
comment
Но когда это 7.54, я хочу, чтобы это было 7.54 - person ; 14.10.2015
comment
для всех намерений и целей 7.00 в точности равно 7, если вы выводите значение в браузер, вы можете выполнить некоторую очистку, чтобы удалить лишние нули. stackoverflow.com/questions/5149129 / - person Martin; 14.10.2015
comment
О, я не знал, что смогу так. Спасибо! - person ; 14.10.2015

Спасибо за помощь в комментариях,

Решение

Float является двоичным, а decimal - ... десятичным, поэтому я изменил свои столбцы на десятичные (16,9)

person Community    schedule 14.10.2015