powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Какой тип данных выбрать
21 сообщений из 21, страница 1 из 1
Какой тип данных выбрать
    #32031627
ДиД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.

Подскажите что делать? Изменить тип данных? Почему такие разные результаты на разных серверах?
...
Рейтинг: 0 / 0
Какой тип данных выбрать
    #32031629
axeval
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насколько я понял из Help'a тип money для хранения мантиссы в SQL2000 использует всего 4 байта, соответственно так и округляет. В SQL 7 не знаю сколько, под рукой нет, но по всей видимости больше. Как вариант - сменить тип данных на real, float,decimal, numeric с соответствующей мантиссой исходя из поставленной задачи. В Help'e все доступно описано.
...
Рейтинг: 0 / 0
Какой тип данных выбрать
    #32031632
Фотография Chicago
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В BOL для SQL7 и SQL2000 описания типа money совпадают дословно. Совпадают и описания заявленной точности вычислений для типа данных.

Извините, уважаемый Axeval, но фраза "для хранения мантиссы в SQL2000 использует всего 4 байта, соответственно так и округляет" демонстрирует, что вы не знаете, что такое мантисса. Во всяком случае основательно подзабыли.

На самом деле речь идет о том, что для типа money сервер хранит 4 десятичных знака после запятой. Но двухтысячник, похоже, действительно округляет результат умножения до 4 знаков, а семерка просто отбрасывает все после четвертого знака. Изменение типа может помочь. (В том смысле, что получите то что в семерке. Но правильно ли это?)

В общем вы уже поняли, что точность вычислений вопрос непростой. И лучше будет, если сами (вместе с заказчиком) решите, как нужно.
...
Рейтинг: 0 / 0
Какой тип данных выбрать
    #32031642
ДиД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для Цены и Количества вполне достаточно типа данных money Простой пример: меня просят по почте файлом Excel (кстати Excel округляет правильно) послать счет. я программно выкидываю данные в лист Excel Цену и Количество, составляю формулы и получаю сумму, а потом выписываю счет-фактуру из своего приложения на основе запроса с сервера. Суммы счета и счет-фактуры не совпадут.
Но т.к. происходит округление при перемножении чисел, то придется в формуле умножения добавить convert какого-либо поля в другой тип.
Извините за настойчивость я просто хотел узнать мнение: какой тип данных используют для широко используемых полей Количество и Цена.
Спасибо.
...
Рейтинг: 0 / 0
Какой тип данных выбрать
    #32031644
Dankov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Компьютер округлил сиё верно
1,35*334,737 получаем наяву 451,89495
но для типа money это значение будет 451,8950
при округлении до 2-х знаков должно стать 451,90

Не верю, что в семерке было не так. Скорее всего, там использовался другой тип.

Если требуется большее число знаков после запятой, надо использовать decimal/numeric. Если использовать float, то в точности выигрыша точно не получите.
...
Рейтинг: 0 / 0
Какой тип данных выбрать
    #32031648
ДиД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот я спрашиваю знающих людей. Что лучше: хранить данные в money, а в расчетах преобразовывать в другой тип, чтобы не было ошибки или сразу хранить в numeric/decimal?
...
Рейтинг: 0 / 0
Какой тип данных выбрать
    #32031658
Dankov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Денежные величины нужно всегда хранить в money с обязательным округлением до 2-х цифр после каждого умножения/деления.

Весовое кол-во, мне кацца, больше напоминает float по своей физической сути.
...
Рейтинг: 0 / 0
Какой тип данных выбрать
    #32031730
Фотография Chicago
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Dankov:

"Компьютер округлил сиё верно
1,35*334,737 получаем наяву 451,89495
но для типа money это значение будет 451,8950
при округлении до 2-х знаков должно стать 451,90

Не верю, что в семерке было не так. Скорее всего, там использовался другой тип."

Напрасно не верите. На семерке именно не так. Я поэкспериментировал и убедился, что все описанное ДиД соответствует действительности.

Насчет типа... Может другой, может этот же, но на выходе результат изменился!!! Что очень обидно. Вот из-за таких вот мелочей и не переползаем на двухтысячник. У нас 300 тысяч строк кода только в хранимых процедурах. И если тестирование много времени не займет (набор тестов для нашей прилады имеется), то переписывать базовые алгоритмы расчета с целью устранить расхождения в результатах никому не хочется.
...
Рейтинг: 0 / 0
Какой тип данных выбрать
    #32031736
Dankov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, вы правы, а я - нет. :-(
Результат на семерке и двухтысячнике разный
...
Рейтинг: 0 / 0
Какой тип данных выбрать
    #32031738
Dankov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Однако, если выбрать типы, как я рекомендовал (деньги - money, измеримое кол-во - float), то результат и на семерке, и на двухтысячнике одинаковый.
...
Рейтинг: 0 / 0
Какой тип данных выбрать
    #32032870
Фотография MarchCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходя из своего опыта констатирую ...
Типом Мани лучше не пользоваться!!!
Для хранения денежных величин лучше всего подходит
детцимал или флоат, ну а если еще и железно указать
два знака после , то ваще будете жить без проблем.

Для точнейшего расчета процентов лучше использовать те же типы только с большим кол. знаков после ,.
С уважением. Фсем удачи, мяф.

PS кто хочет натрах%ться вдоволь пусть выберет мани.
...
Рейтинг: 0 / 0
Какой тип данных выбрать
    #32032871
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для денег я всегда использую numeric (18,2), для количеств - numeric (18,3). Если в запросе присутствует их произведение, то его всегда надо округлять непосредственно при расчете.

Например
select sum(round(Price*Quantity),2) ...

Обязательно надо округлять внутри sum, а не итоговую сумму.
Вообще тема округления денежных сумм весьма большая и таит массу ловушек.

Все это относится только к русскому методу ведения бухгалтерии. У мериканцев, вроде бы могут использоваться доли цента. Если я в этом не прав, прошу меня поправить работающих в штатах участников форума.
...
Рейтинг: 0 / 0
Какой тип данных выбрать
    #32032887
Фотография RedPank
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного не по теме, но ...

MarchCat писал:

... Исходя из своего опыта констатирую ...
Типом Мани лучше не пользоваться!!!
Для хранения денежных величин лучше всего подходит ...


Лучше всего работает (предсказуемее) система, где денежные величины храняться в целом виде.

102 рубля 25 копеек храниться не как 102.249999998 а как 10225.
...
Рейтинг: 0 / 0
Какой тип данных выбрать
    #32033882
SergCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Исходя из своего опыта констатирую ... :)
Для хранения денежных велечин нельзя использовать типы numeric, float, real и т.п. Конечно если вам не безразлична точность последующих вычислений. Все будет "в ажуре" до тех пор, пока Ваша программа не сталкнется с другой программой, которая тоже хочет считать и делает это правильно. Т.е. я совершенно не согласен с утверждением MarchCat.
А вот с RedPank я совершенно согласен. "Серьезные" банковские программы (например, Rs-bank) хранят денежные величины в int. Но только потом на клиенте замучаешься это обрабатывать. Да и с money не все хорошо - не могли что-ли M$ ввести "нормальный" тип для хранения "нормальных" денежных величин с двумя знаками после запятой. Мало того, что лишние биты забираются, так еще и дополнительную проверку на поля надо вешать, чтоб какой-нибудь умник не забубенил туда больше двух знаков после запятой.
В случаях, сходных с ДиДовским, я привожу одну из величин к типу float, тогда и получаемый результат будет типа float и никто ему уже не сделает обрезания. Для MSSQL это нормальная практика, т.к. даже два чиcла типа tinyint редко когда удается перемножить без "ексепшена", потому что результат уже не поместиться в tinyint.
...
Рейтинг: 0 / 0
Какой тип данных выбрать
    #32033956
Владимир Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос к RedPank и SergCat.
Если нужно разделить 100 копеек на троих, то по сколько должен получить каждый?
Если по 33, то куда деть остаток в 1 копеечку, чтобы был баланс? Может переводить на свой счёт - и делится поровну и всем приятно?
...
Рейтинг: 0 / 0
Какой тип данных выбрать
    #32034071
SergCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поскольку копейку на троих разделить невозможно (в материальном смысле), то этот "спор" регулируется с помощью ранее заключенного договора, или с помощью дополнительно соглашения. Если не пришли к конценсусу, то с помощью суда и т.п. :)
...
Рейтинг: 0 / 0
Какой тип данных выбрать
    #32034133
febob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну вообще-то numeric(decimal) это и есть целый тип данных просто задается кол-во знаков после запятой, и если работать с деньгами - то лучше этих типов в MS SQL по моему мнению нет
...
Рейтинг: 0 / 0
Какой тип данных выбрать
    #32034220
Фотография MarchCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to RedPank
1. :) Целочисленное значение нужно так же округлять. (но в целом я согласен)
Я так понял вопрос о знаках после , :)
Так вот главное Мани не пользовать.

to Владимир Смирнов
2. Вопрос о 100 копейках на 3х :)
после / на 3х суммируются результаты и отнимаются от первоначальной суммы - и копеечка возвращается в банк :)))) Если подходить к вопросу концептуально то я тут с SergCat полностью согласен, да, но мы еще и практики :)
...
Рейтинг: 0 / 0
Какой тип данных выбрать
    #32034248
Владимир Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, а если 9 на 5 разделить, то будет каждому по 1, а 4 - в банк. Прям как у лисы Алисы - пять на два не делится? Не делится. Делим два на два. А что осталось - мне!
...
Рейтинг: 0 / 0
Какой тип данных выбрать
    #32034363
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Несколько не по теме. Но тоже о выборе типа.

Есть тип Char и VarChar - Чем они отличаются, понятно. Вопрос в том, начиная с какого размера поля имеет смысл использовать VarChar?

Т.е. есть ли смысл в полях типа VarChar(10) или их имеет смысл использовать при размерах не менее 50 символов?
...
Рейтинг: 0 / 0
Какой тип данных выбрать
    #32034371
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 выполняются помедленней, поэтому если таких транзакций много и скорость обработки критична, этого типа следует избегать.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Какой тип данных выбрать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]