Согласно MSDN , диапазон значений REAL составляет от -3,40E + 38 до -1,18E -38, 0 и 1,18E -38 до 3,40E + 38. Однако У меня есть довольно много значений за пределами этого диапазона в моей таблице.
Следующий запрос возвращает много очень маленьких значений и не возвращает очень больших:
SELECT MyColumn,
*
FROM data.MyTable
WHERE MyColumn <> 0
AND ( MyColumn < CONVERT(REAL, 1.18E-38)
OR MyColumn > CONVERT(REAL, 3.40E+38)
)
AND ( MyColumn < CONVERT(REAL, -3.40E+38)
OR MyColumn > CONVERT(REAL, -1.18E-38)
)
Легко показать, как эти значения попадают в таблицу. Я не могу вставить их напрямую:
CREATE TABLE a(r REAL NULL);
GO
INSERT INTO a(r) VALUES(4.330473E-39);
GO
SELECT r FROM a
GO
DROP TABLE a;
----
0.0
Но я могу разделить два столбца и получить значение вне диапазона:
CREATE TABLE a
(
r1 REAL NULL,
r2 REAL NULL,
r3 REAL NULL
) ;
GO
INSERT INTO a
( r1, r2 )
VALUES ( 4.330473E-38, 1000 ) ;
GO
UPDATE a
SET r3 = r1 / r2 ;
SELECT r1,
r2,
r3
FROM a
r1 r2 r3
------------- ------------- -------------
4.330473E-38 1000 4.330433E-41
Итак, я предполагаю, что MSDN дает неверные диапазоны действительных данных, верно? Я что-то упустил?
Несколько человек предположили, что это ошибка.
Какая именно часть этого поведения является ошибкой. это: