Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 непонятки с конвертацией CONVERT(NUMERIC(20, 2), @real)  [new]
abort
Member

Откуда:
Сообщений: 625
declare
	@real real = 123456789;
SELECT CONVERT(NUMERIC(20, 2), @real)

почему я получаю 123456792.00?
13 май 15, 06:15    [17631907]     Ответить | Цитировать Сообщить модератору
 Re: непонятки с конвертацией CONVERT(NUMERIC(20, 2), @real)  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
abort,
  из BOL
Типы данных float и real называются приблизительными типами данных. 
Поведение float и real соответствует спецификации IEEE 754 для приблизительных 
числовых типов данных.
Приблизительные числовые типы данных не хранят точных значений, 
заданных для многих чисел. Вместо этого они хранят очень хорошее приближение 
для этих значений. Для многих приложений различие между заданным значением 
и хранимым приближением несущественно. Однако в некоторых случаях 
это различие становится ощутимым. По причине приблизительной природы 
типов данных float и real не используйте их, если требуется точность хранения значений. 
Например, в финансовых приложениях, в операциях, связанных с округлением, 
или в проверках на точное равенство. 
Вместо этого используйте целые типы данных, decimal, money или smallmoney.
13 май 15, 07:34    [17631964]     Ответить | Цитировать Сообщить модератору
 Re: непонятки с конвертацией CONVERT(NUMERIC(20, 2), @real)  [new]
abort
Member

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

ок, понятно. С какой целью тогда они нужны, если допускают погрешность и искажение данных даже в целых числах?
Придется все менять на MONEY
13 май 15, 07:40    [17631971]     Ответить | Цитировать Сообщить модератору
 Re: непонятки с конвертацией CONVERT(NUMERIC(20, 2), @real)  [new]
Glory
Member

Откуда:
Сообщений: 104760
abort
С какой целью тогда они нужны, если допускают погрешность и искажение данных даже в целых числах?

А где вы увидели _искажения данных_ ?
13 май 15, 08:17    [17632008]     Ответить | Цитировать Сообщить модератору
 Re: непонятки с конвертацией CONVERT(NUMERIC(20, 2), @real)  [new]
abort
Member

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

123456789 и 123456792
13 май 15, 08:29    [17632021]     Ответить | Цитировать Сообщить модератору
 Re: непонятки с конвертацией CONVERT(NUMERIC(20, 2), @real)  [new]
Glory
Member

Откуда:
Сообщений: 104760
abort
Glory,

123456789 и 123456792

А вы вообще в курсе, что такое числа с плавающей точкой ?
Вы видели, какое значение появилось в переменной после присвоения ей значения ?
Или в Оракле на этот счет опять свои стандарты ?
13 май 15, 08:31    [17632024]     Ответить | Цитировать Сообщить модератору
 Re: непонятки с конвертацией CONVERT(NUMERIC(20, 2), @real)  [new]
abort
Member

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

Где правда?

declare
	@real real = 123456789,
	@num NUMERIC(20, 2);
	
SELECT @num = CAST(@real AS NUMERIC(20, 2)) 
SELECT @num

-- 123456792.00


DECLARE
  v1 REAL := 123456789;
  v2 NUMBER;
BEGIN
  SELECT CAST(v1 AS NUMBER(20,2)) INTO v2 FROM DUAL;
  dbms_output.put_line(v2);
END;

--123456789 
13 май 15, 09:48    [17632289]     Ответить | Цитировать Сообщить модератору
 Re: непонятки с конвертацией CONVERT(NUMERIC(20, 2), @real)  [new]
Glory
Member

Откуда:
Сообщений: 104760
abort
Glory,

Где правда?

Вот тут

declare
	@real real
set @real = 123456789;
select @real
13 май 15, 09:50    [17632299]     Ответить | Цитировать Сообщить модератору
 Re: непонятки с конвертацией CONVERT(NUMERIC(20, 2), @real)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31443
abort
Где правда?
Правда в том, что вы знаете оракл хуже меня, который в справку оракла зашёл в первый раз в жизни? :-)

Тип данных оракла REAL является 8 байтным, и соответсвует сиквельному FLOAT

Вы даже не потрудились вывести значение вашей переменной, хотя вам об этом говорили.

И вам намекали, что тип данных, который хранит только 7 знаков, не может хранить 9 знаков, сколько бы вы не присваивали.
declare
	@real real = 123456789876543,
	@float float = 123456789876543;
SELECT @real as [real], CONVERT(NUMERIC(20, 2), @real) as [NUMERIC1], @float as [float], CONVERT(NUMERIC(20, 2), @float) as [NUMERIC2]

realNUMERIC1floatNUMERIC2
1.234568E+14123456788103168.00123456789876543123456789876543.00
13 май 15, 10:01    [17632347]     Ответить | Цитировать Сообщить модератору
 Re: непонятки с конвертацией CONVERT(NUMERIC(20, 2), @real)  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
abort
Где правда?
Может уже стоит открыть соответствующую статью документации и наконец-то прочитать какая точность у типа real?
13 май 15, 10:35    [17632518]     Ответить | Цитировать Сообщить модератору
 Re: непонятки с конвертацией CONVERT(NUMERIC(20, 2), @real)  [new]
abort
Member

Откуда:
Сообщений: 625
не ожидал что real в oracle и ms sql имеют разную емкость. Много оказывается подводных камней всплывает при переносе проектов с оракле на ms sql. Всем спсб. Вопрос снят.
13 май 15, 12:19    [17633249]     Ответить | Цитировать Сообщить модератору
 Re: непонятки с конвертацией CONVERT(NUMERIC(20, 2), @real)  [new]
Glory
Member

Откуда:
Сообщений: 104760
abort
не ожидал что real в oracle и ms sql имеют разную емкость.

Точнее выражаясь, вы вообще не знали, что у этих типов бывает разрядность
13 май 15, 12:22    [17633275]     Ответить | Цитировать Сообщить модератору
 Re: непонятки с конвертацией CONVERT(NUMERIC(20, 2), @real)  [new]
abort
Member

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

кстати Ваши "звездные" ответы мне не помогли. Ключевая мысль Тип данных оракла REAL является 8 байтным, и соответсвует сиквельному FLOAT
13 май 15, 12:56    [17633528]     Ответить | Цитировать Сообщить модератору
 Re: непонятки с конвертацией CONVERT(NUMERIC(20, 2), @real)  [new]
Glory
Member

Откуда:
Сообщений: 104760
abort
кстати Ваши "звездные" ответы мне не помогли.

Потому что вы наверное так и не запустили
declare
@real real
set @real = 123456789;
select @real

и не увидели, что в переменной получилось значение 1.234568E+08

abort
Ключевая мысль Тип данных оракла REAL является 8 байтным, и соответсвует сиквельному FLOAT

Типа вы это знали ДО этого ?
И float в MSSQL может быть или 4х или 8ми байтным. Что говорит о том, что вы данную вам ссылку на хелп не прочитали

А туда же лезете со "зведными" заявлениями об искажении данных
13 май 15, 13:01    [17633566]     Ответить | Цитировать Сообщить модератору
 Re: непонятки с конвертацией CONVERT(NUMERIC(20, 2), @real)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31443
abort
кстати Ваши "звездные" ответы мне не помогли.
Glory вам сразу написал:
Glory
Вы видели, какое значение появилось в переменной после присвоения ей значения ?

И потом, когда вы не отреагировали, привёл даже код, показывающий ошибку.

Нужно всё таки самому усилия прикладывать, и почитывать документацию...
13 май 15, 17:16    [17635800]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить