SQL Real против Float

Допустим, у меня есть 2 следующих запроса:

select sum(cast(2666 as float)) * cast(.3 as float)
select sum(cast(2666 as real)) * cast(.3 as real)

1-й запрос возвращает:799.8
Второй запрос возвращает:799.800031781197

Почему второй запрос не возвращает то же самое, что и первый?

Ответы на вопрос(1)

Решение Вопроса

вещественные и с плавающей точкой) не могут точно представлять десятичные числа. В частности, невозможно точно хранить 0.3 как двоичное число с плавающей запятой. Вместо этого сохраняется число, очень близкое к 0,3. Это называется ошибкой представления.

Размер ошибки различается для реального и плавающего, потому что они имеют разную точность.

Если вы хотите хранить десятичные числа более точно, рассмотрите возможность использования десятичный или числовой. Но обратите внимание, что, хотя эти типы могут точно хранить десятичные значения с точностью до определенного числа цифр, вычисления все равно могут давать числа, которые не могут быть представлены точно. Например, результат0.1 / 0.3 не может быть сохранен точно вdecimal хотя оба0.1 а также0.3 может. В этом случае результат будет округлен до ближайшего значения, которое может быть сохранено в типе (например,0.333333333 в зависимости от точности).

 DaveBoltman25 мар. 2015 г., 09:56
Да, так же как 1/3 является повторяющимся числом в десятичном виде (0,333333 .. навсегда), оно также повторяется в двоичном виде: 0,01010101010101 --- навсегда. Тем не менее, некоторые неповторяющиеся числа в десятичном виде, такие как 0,1, повторяются в двоичном. Например. 0.1dec = 0.0001100110011 ... навсегда в двоичном виде, и поэтому не может быть точно представлено.

Ваш ответ на вопрос