powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Некорректное округление
14 сообщений из 14, страница 1 из 1
Некорректное округление
    #32025148
Andronick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для записи числа в таблицу _table в поле _field из переменной (@_var) происходит неправильное округление:
insert into _table (_field )
values (round(@_var,2))
В целом работает правильно, но вот в одной записи на копейку значение уменьшается

???
...
Рейтинг: 0 / 0
Некорректное округление
    #32025157
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так не бывает
...
Рейтинг: 0 / 0
Некорректное округление
    #32025167
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие типы у данного поля и переменной?
...
Рейтинг: 0 / 0
Некорректное округление
    #32025170
Andronick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuper - Я тоже думал что не бывает. Однако...
GreenSunrise - У переменной тип - real
- У поля пробовал float и money все едино
В переменную заносятся данные из поля типа float

???
...
Рейтинг: 0 / 0
Некорректное округление
    #32025171
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это ваша ошибка, т.к.
BOL
"float and real
Approximate number data types for use with floating point numeric data. Floating point data is approximate; not all values in the data type range can be precisely represented. "

Нужно использовать decimal, numeric
...
Рейтинг: 0 / 0
Некорректное округление
    #32025205
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Andronick
Может Вы примерчик то потрудились бы привесть? Почему я должен Вам на слово верить, а Вы мне нет?
...
Рейтинг: 0 / 0
Некорректное округление
    #32025209
Andronick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все бы здорово, но с переменными типа decimal, numeric
значения полей в таблице округляются до целого
Хотя может я чего то и не догнал?
Выход я всетаки нашел вместо переменных
использовал просто update, все нормально!
Всем спасибо...
...
Рейтинг: 0 / 0
Некорректное округление
    #32025212
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но с переменными типа decimal, numeric значения полей в таблице округляются до целого
Теперь я вас не понимаю


declare @x decimal(10)
declare @y decimal(10,3)
declare @z decimal(10,6)
set @x = 1/6.00
set @y = 1/6.00
set @z = 1/6.00
select @x, @y, @z, round(@y, 2), round(@z, 3)
...
Рейтинг: 0 / 0
Некорректное округление
    #32025214
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это ж как надо надругаться над таблицей, чтоб в decimal и numeric числа САМИ СОБОЙ округлялись...
>вместо переменных использовал просто update
ымгм. прямо и сказать-то нечего

SergSuper, Вы не в духе? Обычно Ваше появление на форуме приносит ценную и эмоционально нейтральную информацию. Сегодня что-то не так. Улыбнитесь
...
Рейтинг: 0 / 0
Некорректное округление
    #32025226
Andronick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glory - спасибо я поял!
GreenSunrise - чем плох вариант с update, помоему даже шустрее (хотя для очень больших таблиц...?)
SergSuper - Примерчик (обычный курсорчик):


Declare @sum_uslug real, @shifr Int, sf_id Int


declare scan scroll cursor for
select sum_uslug, shifr
from table1…
open scan
fetch first from scan into @sum_uslug, @shifr
while (@@fetch_status = 0)
begin
-- update itog

@sf_id -- генерится

-- Вариант вставки с UPDATE
insert into table2 (sf_id, shifr)
values (@sf_id, @shifr)
update t
set sum_uslug=f.sum_uslug
from table2 t
join table1 f on (t.shifr = f.shifr)
where t.sf_id=@sf_id


-- Вставка через переменные неверное округление с типом REAL (sum_uslug)
--insert into table2 (sf_id , shifr , sum_uslug)
--values (@sf_id , @shifr , round(@sum_uslug,2) )

fetch next from scan into @sum_uslug, @shifr

end

close scan
deallocate scan
...
Рейтинг: 0 / 0
Некорректное округление
    #32025233
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если генерация sf_id укладывается в функцию, то весь этот огород с курсорами, инсертами и апдейтами можно заменить 2-мя строчками:

insert into table2 (sf_id, shifr, sum_uslug)
select gen_sf_id(), shifr, sum_uslug from table1
...
Рейтинг: 0 / 0
Некорректное округление
    #32025237
Andronick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GreenSunrise - Я делаю генерацию внутри курсора
select @sf_id = max(sf_id)+1 from table2
не совсем понял, что значит
> Если генерация sf_id укладывается в функцию
И как я вставлю её в этот запрос ???

> insert into table2 (sf_id, shifr, sum_uslug)
> select gen_sf_id(), shifr, sum_uslug from table1
...
Рейтинг: 0 / 0
Некорректное округление
    #32025249
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если забыть о деталях генерации (вы же не сразу написали, в чем состоит генерация sf_id), то принцип до безобразия прост: создаем функцию, обзывая ее, к примеру, gen_sf_id()

create function gen_sf_id()
returns int
as
begin
-- generate some value with some rules
return (select max(sf_id) + 1 from table2)
end

а потом вся вставка НАБОРА значений из одной таблицы в другую делается ОДНИМ оператором:

insert into table2 (sf_id, shifr, sum_uslug)
select gen_sf_id(), shifr, sum_uslug from table1

Эта штука заменяет весь цикл по курсору.
----------------------------------------
Теперь. Если все-таки обратить внимание, на то, что вы делаете ПО СМЫСЛУ, то все это бодяга здорово настораживает. Почему не использовать identity? Зачем эти самоделки насчет max(sf_id) + 1? А вы продумали работу системы при множестве пользователей? Нет. Вам не пришло в голову, что между запросом максимального значения и вставкой его плюс 1 в другую таблицу есть разница во времени? Если в этот промежуток другой пользователь выполнит этот код, то будет вставка ДВУХ строк с одним и тем же sf_id. Да и при увеличении таблицы поиск максимального значения будет все более и более накладной операцией. Нужны еще доводы или этих хватит?
...
Рейтинг: 0 / 0
Некорректное округление
    #32025259
Andronick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Нужны еще доводы или этих хватит?
Согласен. Спасибо учту!!!
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Некорректное округление
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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