|
|
|
Какой тип данных выбрать
|
|||
|---|---|---|---|
|
#18+
SQL2000 Таблица имеет поля Цена (money), Количество (money). При вычислении в запросе SELECT Цена * Количество AS Сумма FROM Таблица значений 1,35*334,737=451,895. Округляя по правилу до 2 знаков после запятой получаем 451,90. На самом деле (если проверить по калькулятору или в Excel) 35*334,737=451,89495, то должно быть 451,89 Те же значения проверялись в SQL7, там результат запроса был 451,8949. Подскажите что делать? Изменить тип данных? Почему такие разные результаты на разных серверах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2002, 13:42:13 |
|
||
|
Какой тип данных выбрать
|
|||
|---|---|---|---|
|
#18+
Насколько я понял из Help'a тип money для хранения мантиссы в SQL2000 использует всего 4 байта, соответственно так и округляет. В SQL 7 не знаю сколько, под рукой нет, но по всей видимости больше. Как вариант - сменить тип данных на real, float,decimal, numeric с соответствующей мантиссой исходя из поставленной задачи. В Help'e все доступно описано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2002, 14:05:29 |
|
||
|
Какой тип данных выбрать
|
|||
|---|---|---|---|
|
#18+
В BOL для SQL7 и SQL2000 описания типа money совпадают дословно. Совпадают и описания заявленной точности вычислений для типа данных. Извините, уважаемый Axeval, но фраза "для хранения мантиссы в SQL2000 использует всего 4 байта, соответственно так и округляет" демонстрирует, что вы не знаете, что такое мантисса. Во всяком случае основательно подзабыли. На самом деле речь идет о том, что для типа money сервер хранит 4 десятичных знака после запятой. Но двухтысячник, похоже, действительно округляет результат умножения до 4 знаков, а семерка просто отбрасывает все после четвертого знака. Изменение типа может помочь. (В том смысле, что получите то что в семерке. Но правильно ли это?) В общем вы уже поняли, что точность вычислений вопрос непростой. И лучше будет, если сами (вместе с заказчиком) решите, как нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2002, 14:33:45 |
|
||
|
Какой тип данных выбрать
|
|||
|---|---|---|---|
|
#18+
Для Цены и Количества вполне достаточно типа данных money Простой пример: меня просят по почте файлом Excel (кстати Excel округляет правильно) послать счет. я программно выкидываю данные в лист Excel Цену и Количество, составляю формулы и получаю сумму, а потом выписываю счет-фактуру из своего приложения на основе запроса с сервера. Суммы счета и счет-фактуры не совпадут. Но т.к. происходит округление при перемножении чисел, то придется в формуле умножения добавить convert какого-либо поля в другой тип. Извините за настойчивость я просто хотел узнать мнение: какой тип данных используют для широко используемых полей Количество и Цена. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2002, 15:55:47 |
|
||
|
Какой тип данных выбрать
|
|||
|---|---|---|---|
|
#18+
Компьютер округлил сиё верно 1,35*334,737 получаем наяву 451,89495 но для типа money это значение будет 451,8950 при округлении до 2-х знаков должно стать 451,90 Не верю, что в семерке было не так. Скорее всего, там использовался другой тип. Если требуется большее число знаков после запятой, надо использовать decimal/numeric. Если использовать float, то в точности выигрыша точно не получите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2002, 16:00:14 |
|
||
|
Какой тип данных выбрать
|
|||
|---|---|---|---|
|
#18+
Вот я спрашиваю знающих людей. Что лучше: хранить данные в money, а в расчетах преобразовывать в другой тип, чтобы не было ошибки или сразу хранить в numeric/decimal? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2002, 16:20:02 |
|
||
|
Какой тип данных выбрать
|
|||
|---|---|---|---|
|
#18+
Денежные величины нужно всегда хранить в money с обязательным округлением до 2-х цифр после каждого умножения/деления. Весовое кол-во, мне кацца, больше напоминает float по своей физической сути. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2002, 17:17:38 |
|
||
|
Какой тип данных выбрать
|
|||
|---|---|---|---|
|
#18+
2Dankov: "Компьютер округлил сиё верно 1,35*334,737 получаем наяву 451,89495 но для типа money это значение будет 451,8950 при округлении до 2-х знаков должно стать 451,90 Не верю, что в семерке было не так. Скорее всего, там использовался другой тип." Напрасно не верите. На семерке именно не так. Я поэкспериментировал и убедился, что все описанное ДиД соответствует действительности. Насчет типа... Может другой, может этот же, но на выходе результат изменился!!! Что очень обидно. Вот из-за таких вот мелочей и не переползаем на двухтысячник. У нас 300 тысяч строк кода только в хранимых процедурах. И если тестирование много времени не займет (набор тестов для нашей прилады имеется), то переписывать базовые алгоритмы расчета с целью устранить расхождения в результатах никому не хочется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2002, 14:31:08 |
|
||
|
Какой тип данных выбрать
|
|||
|---|---|---|---|
|
#18+
Да, вы правы, а я - нет. :-( Результат на семерке и двухтысячнике разный ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2002, 15:39:20 |
|
||
|
Какой тип данных выбрать
|
|||
|---|---|---|---|
|
#18+
Однако, если выбрать типы, как я рекомендовал (деньги - money, измеримое кол-во - float), то результат и на семерке, и на двухтысячнике одинаковый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2002, 15:42:08 |
|
||
|
Какой тип данных выбрать
|
|||
|---|---|---|---|
|
#18+
Исходя из своего опыта констатирую ... Типом Мани лучше не пользоваться!!! Для хранения денежных величин лучше всего подходит детцимал или флоат, ну а если еще и железно указать два знака после , то ваще будете жить без проблем. Для точнейшего расчета процентов лучше использовать те же типы только с большим кол. знаков после ,. С уважением. Фсем удачи, мяф. PS кто хочет натрах%ться вдоволь пусть выберет мани. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2002, 19:54:07 |
|
||
|
Какой тип данных выбрать
|
|||
|---|---|---|---|
|
#18+
Для денег я всегда использую numeric (18,2), для количеств - numeric (18,3). Если в запросе присутствует их произведение, то его всегда надо округлять непосредственно при расчете. Например select sum(round(Price*Quantity),2) ... Обязательно надо округлять внутри sum, а не итоговую сумму. Вообще тема округления денежных сумм весьма большая и таит массу ловушек. Все это относится только к русскому методу ведения бухгалтерии. У мериканцев, вроде бы могут использоваться доли цента. Если я в этом не прав, прошу меня поправить работающих в штатах участников форума. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2002, 20:29:01 |
|
||
|
Какой тип данных выбрать
|
|||
|---|---|---|---|
|
#18+
Немного не по теме, но ... MarchCat писал: ... Исходя из своего опыта констатирую ... Типом Мани лучше не пользоваться!!! Для хранения денежных величин лучше всего подходит ... Лучше всего работает (предсказуемее) система, где денежные величины храняться в целом виде. 102 рубля 25 копеек храниться не как 102.249999998 а как 10225. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2002, 09:20:07 |
|
||
|
Какой тип данных выбрать
|
|||
|---|---|---|---|
|
#18+
Исходя из своего опыта констатирую ... :) Для хранения денежных велечин нельзя использовать типы numeric, float, real и т.п. Конечно если вам не безразлична точность последующих вычислений. Все будет "в ажуре" до тех пор, пока Ваша программа не сталкнется с другой программой, которая тоже хочет считать и делает это правильно. Т.е. я совершенно не согласен с утверждением MarchCat. А вот с RedPank я совершенно согласен. "Серьезные" банковские программы (например, Rs-bank) хранят денежные величины в int. Но только потом на клиенте замучаешься это обрабатывать. Да и с money не все хорошо - не могли что-ли M$ ввести "нормальный" тип для хранения "нормальных" денежных величин с двумя знаками после запятой. Мало того, что лишние биты забираются, так еще и дополнительную проверку на поля надо вешать, чтоб какой-нибудь умник не забубенил туда больше двух знаков после запятой. В случаях, сходных с ДиДовским, я привожу одну из величин к типу float, тогда и получаемый результат будет типа float и никто ему уже не сделает обрезания. Для MSSQL это нормальная практика, т.к. даже два чиcла типа tinyint редко когда удается перемножить без "ексепшена", потому что результат уже не поместиться в tinyint. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.06.2002, 22:36:34 |
|
||
|
Какой тип данных выбрать
|
|||
|---|---|---|---|
|
#18+
Вопрос к RedPank и SergCat. Если нужно разделить 100 копеек на троих, то по сколько должен получить каждый? Если по 33, то куда деть остаток в 1 копеечку, чтобы был баланс? Может переводить на свой счёт - и делится поровну и всем приятно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2002, 12:38:49 |
|
||
|
Какой тип данных выбрать
|
|||
|---|---|---|---|
|
#18+
Поскольку копейку на троих разделить невозможно (в материальном смысле), то этот "спор" регулируется с помощью ранее заключенного договора, или с помощью дополнительно соглашения. Если не пришли к конценсусу, то с помощью суда и т.п. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.06.2002, 23:12:47 |
|
||
|
Какой тип данных выбрать
|
|||
|---|---|---|---|
|
#18+
ну вообще-то numeric(decimal) это и есть целый тип данных просто задается кол-во знаков после запятой, и если работать с деньгами - то лучше этих типов в MS SQL по моему мнению нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2002, 14:25:56 |
|
||
|
Какой тип данных выбрать
|
|||
|---|---|---|---|
|
#18+
to RedPank 1. :) Целочисленное значение нужно так же округлять. (но в целом я согласен) Я так понял вопрос о знаках после , :) Так вот главное Мани не пользовать. to Владимир Смирнов 2. Вопрос о 100 копейках на 3х :) после / на 3х суммируются результаты и отнимаются от первоначальной суммы - и копеечка возвращается в банк :)))) Если подходить к вопросу концептуально то я тут с SergCat полностью согласен, да, но мы еще и практики :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2002, 06:13:47 |
|
||
|
Какой тип данных выбрать
|
|||
|---|---|---|---|
|
#18+
Ну да, а если 9 на 5 разделить, то будет каждому по 1, а 4 - в банк. Прям как у лисы Алисы - пять на два не делится? Не делится. Делим два на два. А что осталось - мне! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2002, 11:37:01 |
|
||
|
Какой тип данных выбрать
|
|||
|---|---|---|---|
|
#18+
Несколько не по теме. Но тоже о выборе типа. Есть тип Char и VarChar - Чем они отличаются, понятно. Вопрос в том, начиная с какого размера поля имеет смысл использовать VarChar? Т.е. есть ли смысл в полях типа VarChar(10) или их имеет смысл использовать при размерах не менее 50 символов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2002, 20:35:57 |
|
||
|
Какой тип данных выбрать
|
|||
|---|---|---|---|
|
#18+
9 копеек (центов, пфенингов) на 5 делится следующим образом: 1. 1 2. 1 3. 1 4. 1 5. 5 Где "5"=9 - ("1"+"2"+"3"+"4") Если делить так 1. 1 2. 1 3. 1 4. 1 5. 1 банк 4 то это называется "Атака спагетти" 2 ВладимирМ На мой взгляд, тип VarChar имеет смысл использовать, во-первых, в редкоизменяемых справочниках, во-вторых, если разброс возможных длин составляет не менее 100 символов. А в третьих, при нынешних объемах HDD, это не принципиально. NChar занимает место в два раза больше, чем Char и никого это не волнует. Запросы на изменение для записей с VarChar выполняются помедленней, поэтому если таких транзакций много и скорость обработки критична, этого типа следует избегать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.06.2002, 21:16:52 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=46&tid=1822110]: |
0ms |
get settings: |
5ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
40ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 219ms |
| total: | 313ms |

| 0 / 0 |
