LIME пишет:Мелкий че молчишь? Прочитал что есть децимал на самом деле?
Мелкий спит. А прочитал уже давно. И так же давно уже ходил по граблям float'ов.
LIME пишет:пояснения будут?
Потому что float - число с плавающей точкой, для научных данных. Не маленький уже, должен про особенности вычислений и хранения float знать.
LIME пишет:ткни...не нашел
https://dev[dot]mysql[dot]com/doc/refman[dot][dot][dot]point-types[dot]html
Цитата:These types are used when it is important to preserve exact precision, for example with monetary data.
Про грабли там же написано, при выполнении вычислений можно поймать приведение типа к float, делением на 3, например.
LIME пишет:с повышеной точностью
Что тебе неясно в наименовании Fixed-Point Types?
Да, больше места требует в байтовом эквиваленте и несколько сложнее в обработке. Но это деньги.
LIME пишет:но флоатом лучше потому что ресурсов меньше жрет
Деньги не требуют повышеной точности
Ох ёпт. Надеюсь, ты никогда с деньгами работать не будешь, хотя бы пока по рукам не надают.
LIME пишет:Это же и от децимала можно отловить
Нельзя. На мануал ссылку уже дал. Там об этом прямым текстом говорится.
LIME пишет:Я рассказывал именно что оно выглядит так
А хранится гораздо хуже
И хранится оно в бинарном виде кучкой байт. И именно потому этих байт надо столько сколько надо, чтобы хранить именно и в точности то, что было записано. А не приближённое значение.
Были ли грабли от хранения денег в float'ах на личной шкуре? Были, разумеется. На паре прошлых проектов в базе болталось дофига народа с отрицательным балансом на цифры до рубля.
Начислить 100 рублей, списать 100 рублей - всё, баланс нулю не равняется.
Был человек, которому не могли выплатить его деньги - минимальная сумма к выплате 250р., на балансе 249,999994 рубля. Сколько выводилось с таким постпроцессингом на выводе в профиле и админке предлагаю угадать самостоятельно.
Ещё специфичные для mysql грабли, кстати. Типовая задача, мы хотим аггрегировать балланс юзера по большой исходной табличке.
CODE ( SQL):
скопировать код в буфер обмена
CREATE TABLE testfloat ( amount float ) engine=innodb; INSERT INTO testfloat VALUES (1000000.0),(5.5),(300000.0),(0.05); CREATE TABLE test (val float) SELECT sum(amount) AS val FROM testfloat; SELECT * FROM test;
У нас, к счастью, на выплатах просчитывался баланс чистый по исходным таблицам. Потому заметили весьма не сразу.
|