Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 CONVERT(MONEY, Field) не работает для выражения  [new]
ypmail
Member

Откуда:
Сообщений: 331
Почему
CONVERT(MONEY, Field)
округляет до сотых,
а
CONVERT(MONEY,(Field + 0.18 * Field1 + 0.015 * Field2))
нет? Т.е. для поля работает, а для выражения не хочет. Что посоветуете?
30 дек 15, 15:31    [18628379]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Да невже ?

select CONVERT(money, (y.x*10.0 +y.xx))
from (
 select x = 10.5, xx =20.0

)Y
--------------------
125.00
30 дек 15, 15:48    [18628508]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
ypmail,

поле интовое?
30 дек 15, 15:50    [18628520]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
ypmail
Member

Откуда:
Сообщений: 331


К сообщению приложен файл. Размер - 120Kb
30 дек 15, 15:54    [18628549]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
чет мне сильно кажеться что вам сюда
30 дек 15, 16:10    [18628692]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
ypmail
Что посоветуете?
Открыть документацию и убедиться, что точность money 4 знака, а не 2.
30 дек 15, 16:26    [18628788]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
ypmail
Member

Откуда:
Сообщений: 331
Заменил на
CONVERT(NUMERIC(19,2),(Field + 0.18 * Field1 + 0.015 * Field2))


Вроде бы работает. Получается, что берётся 19 десятичных знаков и потом округляется до 2-х. Округление в большую сторону происходит с 0,005.
30 дек 15, 18:37    [18629384]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
ypmail
Member

Откуда:
Сообщений: 331
Мне нужно не округлять, а отбрасывать значения. С ROUND не получается.
30 дек 15, 18:45    [18629411]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ypmail
Мне нужно не округлять, а отбрасывать значения. С ROUND не получается.
У ROUND() есть третий параметр!
30 дек 15, 19:23    [18629548]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
ypmail
Member

Откуда:
Сообщений: 331
iap
ypmail
Мне нужно не округлять, а отбрасывать значения. С ROUND не получается.
У ROUND() есть третий параметр!


Дело не в этом, с ROUND нули приписываются при округлении, приходится комбинировать его с numeric, чтобы отбросить нули и вывести значения в формате 0,00
CONVERT(NUMERIC(19,2), ROUND((Field + 0.18 * Field1 + 0.015 * Field2),2,1))
30 дек 15, 20:12    [18629729]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
Oleksii Kovalov
Member

Откуда:
Сообщений: 100
ypmail
Дело не в этом, с ROUND нули приписываются при округлении, приходится комбинировать его с numeric, чтобы отбросить нули и вывести значения в формате 0,00

При всём уважении, но задача отображения значений должна быть возложена на клиентское средство рендеринга, а вовсе не на скуль сервер
а то так можно будет дойти до того чтобы требовать отображения нужного значка валюты, разделителя групп, целой и десятичной части
Ну или цвета ячейки.
2 янв 16, 02:44    [18635635]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Oleksii Kovalov
ypmail
Дело не в этом, с ROUND нули приписываются при округлении, приходится комбинировать его с numeric, чтобы отбросить нули и вывести значения в формате 0,00

При всём уважении, но задача отображения значений должна быть возложена на клиентское средство рендеринга, а вовсе не на скуль сервер
а то так можно будет дойти до того чтобы требовать отображения нужного значка валюты, разделителя групп, целой и десятичной части
Ну или цвета ячейки.
Вот вы смеетесь, а у меня на работе один из авторов отчетов формирует значение цвета ячейки в хранимой процедуре и возвращает его в рекордсете, который потом преобразуется в XML и цвет через XSLT передается в результирующий HTML-файл отчета.
4 янв 16, 11:21    [18640745]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
ypmail
Member

Откуда:
Сообщений: 331
У меня на работе программа на Java, в неё вносятся работы и материалы, она считает стоимость заявки. Эти данные я заношу параллельно с оформлением заявки в свою программу (на SQL). Моя программа предварительно считает сколько мне потом пришлют денег в счетах с учётом НДС и бонусов. Так вот, алгоритма их подсчётов я не знаю, а разница в подсчитанных моей программой значениях и по факту в присланных счетах порой составляет до 4-х копеек. Предполагаю, что проблема где-то в округлениях промежуточных значений. Моя тоно считает, а их где-то округляет. Вот я и хочу попробовать все промежуточные значения округлить до сотых, а потом сравнить с их значениями. Хочу, чтобы моя программа считала так же как и их.

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

Ещё заметил, что у меня в таблицах (где я вношу стоимости материалов) значения int (значения изначально вносятся с большим кол-вом цифр после запятой, этого для стоимости материалов не надо). Отсюда вычисления не совсем точные. Поменял тип данных с int на decimal(18, 2). Теперь значения более точные (но все равно суммы пляшут в 1 коп., это скорее у них неточность, наверное при переводе из евро в рубли, я же сразу в рублях считаю).

Правильно поменял на decimal(18, 2) или лучше использовать другой тип данных для ввода с округлением до сотых?
4 янв 16, 20:35    [18642216]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31965
ypmail
Правильно поменял на decimal(18, 2) или лучше использовать другой тип данных для ввода с округлением до сотых?
Нужно узнавать (пытаться смоделировать) правильный алгоритм расчётов.
Проблема не в точности вычислений, а именно в алгоритме расчёта.
4 янв 16, 23:46    [18642834]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
edyaN
Member

Откуда: Berlin
Сообщений: 185
ypmail,

используйте decimal(18, 8).
А для констант используйте явное приведение типов. Это не обяязательно решит вашу проблему, но сильно облегчит поиск ошибок.
вот так неправильно:

CONVERT(NUMERIC(19,2), ROUND((Field + 0.18 * Field1 + 0.015 * Field2),2,1))

надо так:
Field + cast(0.18 as decimal(18, 8)) * Field1 + cast(0.015 as decimal(18, 8)) * Field2
5 янв 16, 13:33    [18643763]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
ypmail
Member

Откуда:
Сообщений: 331
Для чего мне тащить ненужные знаки после запятой при вводе данных, если есть только рубли и копейки и достаточно вводить значения в формате 0,00?
decimal(18, 8) дает 8 знаков после запятой, а decimal(18, 2) только 2, что мне и нужно. Пробовал всевозможные вариации с данными, вариант с decimal(18, 2) оказался самым точным, разница получается в 1 копейку. А то, что их программа выдаёт эту разницу в копейку могу только объяснить тем, что она сначала считает в евро, а потом переводит итоговое значение в рубли, я же сразу считаю в рублях.

Их значения:
3555.87
21725.41

Мои значения со всевозможными вариантами округлений и отбрасываний знаков после запятой:
3555.8600000000001
3555.86
3555.8600

21725.419999999998
21725.42
21725.4200

Их копейку в плюс или минус могу объяснить только расчетами в другой валюте, а потом переводом в рубли, т.к. никаким законам математики их цифры не соответствуют. Такие пляски наблюдаются только с материалами, по работам всё копейка в копейку, т.к. работы считаются по фиксированной ставке в рублях.
5 янв 16, 15:03    [18644036]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
edyaN
Member

Откуда: Berlin
Сообщений: 185
ypmail,

у вас в вычислениях стоит множитель 0.015. Если его умножить на тип money, то у вас появляется сразу 7 знаков после запятой, поэтому 2 знака точно мало.
5 янв 16, 17:06    [18644498]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
ypmail
Member

Откуда:
Сообщений: 331
edyaN
ypmail,

у вас в вычислениях стоит множитель 0.015. Если его умножить на тип money, то у вас появляется сразу 7 знаков после запятой, поэтому 2 знака точно мало.


0.015 это 1,5% от стоимости материалов, которая имеет максимальную точность - копейки, т.е. 0,00 руб. Конечное полученное значение имеет смысл округлить до сотых. Тоже самое с 0,18 - НДС.

Есть смысл записать так:
CONVERT(NUMERIC(19,2),(1.18Field + 0.015 * Field1))

или
CONVERT(DECIMAL(19,2),(1.18Field + 0.015 * Field1))


где Field - стоимость всех материалов (Field = Field1+Field2)
Field1 - стоимость собственных материалов
Field2 - стоимость сторонних материалов

Все стоимости вносятся в физическую таблицу в формате 0,00, т.к. я выставил тип данных
DECIMAL(19,2)


Что предпочтительнее использовать
NUMERIC
или
DECIMAL
?
5 янв 16, 18:34    [18644828]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
ypmail
Member

Откуда:
Сообщений: 331
Разобрался, DECIMAL подходит лучше
5 янв 16, 18:41    [18644855]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ypmail
Разобрался, DECIMAL подходит лучше
Чем же, интересно?
Писать короче (DEC)?
5 янв 16, 19:10    [18644950]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
ypmail
Member

Откуда:
Сообщений: 331
iap,

[url=]https://www.sql.ru/faq/faq_topic.aspx?fid=274[/url]
5 янв 16, 19:12    [18644956]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ypmail
iap,

[url=]https://www.sql.ru/faq/faq_topic.aspx?fid=274[/url]
Глубоко!
Особенно если учесть, что m<=m.
5 янв 16, 19:19    [18644973]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
ypmail
Member

Откуда:
Сообщений: 331
Кстати, в представлении уже не пришлось применять DECIMAL для приведения итогов расчетов к формату 0,00. Данные уже и так представляются в этом формате после изменения типа данных в физических таблицах, несмотря на то, что над ними проводятся вычисления.

Пробежался ещё раз по данным, разница между моими значениями и значениями в счетах составляет максимум 3 копейки. Может быть как в меньшую, так и в большую сторону. Как в примере выше, математическими законами и законами округления не объясняется, скорее всего проблема в пересчетах валют, там (в курсах валют) и количество знаков после запятой больше.

Мне в программе показывают суммы материалов в рублях с округлением до сотых, а когда присылают счета, то считают в евро, а потом переводят в рубли и округляют, поэтому и такая разница. Мне нет смысла постоянно мониторить их внутренний курс евро (тем более заносить его каждый день вручную в свою базу), чтобы свою базу синхронизировать с их базой с точностью 100 %. Ограничусь погрешностью в 3 копейки.
5 янв 16, 19:22    [18644983]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
ypmail
Member

Откуда:
Сообщений: 331
iap
ypmail
iap,

[url=]https://www.sql.ru/faq/faq_topic.aspx?fid=274[/url]
Глубоко!
Особенно если учесть, что m<=m.


Ваши предложения, разъяснения, советы???
5 янв 16, 19:24    [18644987]     Ответить | Цитировать Сообщить модератору
 Re: CONVERT(MONEY, Field) не работает для выражения  [new]
Glory
Member

Откуда:
Сообщений: 104751
ypmail
Ваши предложения, разъяснения, советы???

Совет нр.1 - не путать nterBase, Firebird, Yaffil и MS SQL
Совет нр.2 - сведения о типах данных брать из официального хелпа продукта
5 янв 16, 20:58    [18645260]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить