|
|
|
| Нужно хранить числа, которые по размеру подходят под smallint unsigned, но с 1 знаком после запятой.
В чем разница между float и decimal, и в каком формате лучше хранить значения в данном случае? | |
|
|
|
|
|
|
|
для: Sfinks
(12.02.2012 в 16:50)
| | float - это, как правило, 4-8 байт, часть информации под мантису, часть по степень. Понятное дело, число хранится не точно, а приближенно в виде математической модели, которая уже отлита в процессоре - поэтому операции выполняются очень быстро. Так как это модель, а не точное число, при вычислениях быстро начинаются накапливаться ошибки вычисления. decimal - это фактически строка, одна цифра - один символ. Если у вас в числе 153 цифр - оно займет 153 байт. Зато уж ничего не пропадает при сложениях, вычитаниях, понятно, что это даже не то что не уровень сопроцессора, это даже не уровень операционной системы - работает символьная библиотека. Поэтому медленнее, чем float в разы (впрочем если у вас не биллинг сотовой компании, вы эти разы все-равно долго еще не ощутите :). Как правило, если речь о деньгах, то выбирают decimal (за ради денег он и введен), если о это какая-нибудь температура, то лучше float. Хотя в вашем случае decimal будет даже дешевле по объему (хотя потеряете в скорости). | |
|
|
|
|
|
|
|
для: cheops
(12.02.2012 в 16:59)
| | > Как правило, если речь о деньгах, то выбирают decimal (за ради денег он и введен)
В данном случае ДА, это именно про деньги речь идет. Тем не менее хотелось бы понять:
> Так как это модель, а не точное число, при вычислениях быстро начинаются
> накапливаться ошибки вычисления.
Но там ведь эта погрешность наверняка где-то в 15ом знаке после запятой начинает появляться? Если у меня округление идет до 1го знака, и вычисления ограничиваются одним действием +/-, после чего новое значение округляется и заносится в БД, тут же никаких погрешностей быть не может?
И сразу попутный вопрос. Запрос, типа:
UPDATE tbl SET cred = cred + 0.2
| будет корректно работать с обоими типами? | |
|
|
|
|
|
|
|
для: Sfinks
(12.02.2012 в 17:22)
| | >Но там ведь эта погрешность наверняка где-то в 15ом знаке после запятой начинает
>появляться? Если у меня округление идет до 1го знака, и вычисления ограничиваются одним
>действием +/-, после чего новое значение округляется и заносится в БД, тут же никаких
>погрешностей быть не может?
Да, только нужно постоянно округлять и помнить, что оператор == уже не для вас. Если деньги, то не жадничайте, используйте DECIMАL.
>будет корректно работать с обоими типами?
Да, только в случае FLOAT там уже не будет округленного числа, а будет хвостик, поэтому оператор == уже не применить. Т.е. чтобы узнать, что у вас нулевой счет, просто сравнить с 0.0 уже не получится, нужно будет даже заведомо нулевое значение округлять, чтобы не дай бог там не было хвоста. | |
|
|
|
|
|
|
|
для: cheops
(12.02.2012 в 17:49)
| | Ясно. Спасибо за разъяснения! | |
|
|
|