Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Mysql. Не работает ROUND() [3]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): « 1 2 [3]   

> Без описания
LIME
Отправлено: 23 Июня, 2015 - 02:02:01
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




А че?
Агрегировал же 28 тысяч чисел? Ну вот! Какие сотни миллионов у меня этого не будет!
 
 Top
MiksIr
Отправлено: 23 Июня, 2015 - 02:03:02
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


LIME пишет:
Флоат менее прожорлив
Он быстрее
Это число

int еще менее прожорлив и еще более быстрее. Профит. Закрыли тему.


-----
self-banned
 
 Top
LIME
Отправлено: 23 Июня, 2015 - 02:04:19
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Блин спор не о том что деньги можно целым хранить!
Я о том что хранить в децимале ради форматирование и есть ламерство
Хотя
Я уже понял что тут не спор ....
 
 Top
MiksIr
Отправлено: 23 Июня, 2015 - 02:07:12
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


Не форматирование, а предотвращение потенциальной ошибки точности.


-----
self-banned
 
 Top
LIME
Отправлено: 23 Июня, 2015 - 02:12:28
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




MiksIr ага
Если там же в запросе исполнять арифметику
Ну...я уже начинаю уставать от вас отбиваться
Мне уже всеравно
Храни число в децимал....я не буду
 
 Top
SAD
Отправлено: 23 Июня, 2015 - 09:29:43
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2508
Дата рег-ции: Май 2009  
Откуда: Днепропетровск, Украина


Помог: 75 раз(а)




Я 4 года работал с числами, которые хранились не в децимал - это ад) Хранились цены, суммы, вес товара. Так что храните в децимал, пока не поздно
 
 Top
LIME
Отправлено: 23 Июня, 2015 - 09:56:04
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Ой
Нечего сказать
Видимо да
Храните в децимале
А я ...а кого волнует
 
 Top
Мелкий Супермодератор
Отправлено: 23 Июня, 2015 - 11:28:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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):
скопировать код в буфер обмена
  1. CREATE TABLE testfloat (
  2. amount float
  3. ) engine=innodb;
  4. INSERT INTO testfloat VALUES (1000000.0),(5.5),(300000.0),(0.05);
  5. CREATE TABLE test (val float) SELECT sum(amount) AS val FROM testfloat;
  6. SELECT * FROM test;

У нас, к счастью, на выплатах просчитывался баланс чистый по исходным таблицам. Потому заметили весьма не сразу.


-----
PostgreSQL DBA
 
 Top
LIME
Отправлено: 23 Июня, 2015 - 13:01:15
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Мелкий пишет:
Да, больше места требует в байтовом эквиваленте и несколько сложнее в обработке. Но это деньги.
дык тото и то
Хотя если чесно я не особо думал
Видимо надо подумать
Хотя Мелкий и может ошибаться но как правило нет
Хотя...не буду я ниче писать
Ииии... тут скорее я прав....но...поглядим внимательнее
(Добавление)
Блин что я несу
Удачи адиос!
 
 Top
Мелкий Супермодератор
Отправлено: 23 Июня, 2015 - 14:54:49
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




LIME пишет:
дык тото и то

А ничего не писать - ещё быстрее и места вообще не требуется.
Сначала требования предметной области, потом техничка. Не наоборот. Даже для хайлоада.


-----
PostgreSQL DBA
 
 Top
MiksIr
Отправлено: 23 Июня, 2015 - 15:37:11
Post Id


Забанен


Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014  


Помог: 10 раз(а)

[+]


Пример, что будет если забыть round или поставить его "не там".

CODE (text):
скопировать код в буфер обмена
  1. mysql> SELECT * FROM `testfloat` WHERE round(amount,2) != amount2;
  2. Empty set (0.01 sec)


CODE (text):
скопировать код в буфер обмена
  1. mysql> SELECT round(sum(amount),2),sum(amount2) FROM `testfloat`;
  2. +----------------------+--------------+
  3. | round(sum(amount),2) | sum(amount2) |
  4. +----------------------+--------------+
  5. |         494878986.90 | 494878987.01 |
  6. +----------------------+--------------+


Это всего-лишь 10к записей. Одно поле - float, другое - decimal.


-----
self-banned
 
 Top
Страниц (3): « 1 2 [3]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB