непонятки с конвертацией CONVERT(NUMERIC(20, 2), @real)

abort
Дата: 13.05.2015 06:15:42
declare
	@real real = 123456789;
SELECT CONVERT(NUMERIC(20, 2), @real)

почему я получаю 123456792.00?
LexusR
Дата: 13.05.2015 07:34:08
abort,
  из BOL
Типы данных float и real называются приблизительными типами данных. 
Поведение float и real соответствует спецификации IEEE 754 для приблизительных 
числовых типов данных.
Приблизительные числовые типы данных не хранят точных значений, 
заданных для многих чисел. Вместо этого они хранят очень хорошее приближение 
для этих значений. Для многих приложений различие между заданным значением 
и хранимым приближением несущественно. Однако в некоторых случаях 
это различие становится ощутимым. По причине приблизительной природы 
типов данных float и real не используйте их, если требуется точность хранения значений. 
Например, в финансовых приложениях, в операциях, связанных с округлением, 
или в проверках на точное равенство. 
Вместо этого используйте целые типы данных, decimal, money или smallmoney.
abort
Дата: 13.05.2015 07:40:39
LexusR,

ок, понятно. С какой целью тогда они нужны, если допускают погрешность и искажение данных даже в целых числах?
Придется все менять на MONEY
Glory
Дата: 13.05.2015 08:17:29
abort
С какой целью тогда они нужны, если допускают погрешность и искажение данных даже в целых числах?

А где вы увидели _искажения данных_ ?
abort
Дата: 13.05.2015 08:29:07
Glory,

123456789 и 123456792
Glory
Дата: 13.05.2015 08:31:43
abort
Glory,

123456789 и 123456792

А вы вообще в курсе, что такое числа с плавающей точкой ?
Вы видели, какое значение появилось в переменной после присвоения ей значения ?
Или в Оракле на этот счет опять свои стандарты ?
abort
Дата: 13.05.2015 09:48:33
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 
Glory
Дата: 13.05.2015 09:50:45
abort
Glory,

Где правда?

Вот тут

declare
	@real real
set @real = 123456789;
select @real
alexeyvg
Дата: 13.05.2015 10:01:27
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
invm
Дата: 13.05.2015 10:35:42
abort
Где правда?
Может уже стоит открыть соответствующую статью документации и наконец-то прочитать какая точность у типа real?