Вопрос по sql-server, sql – SQL Real против Float

8

Допустим, у меня есть 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   ответ
18

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

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

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

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

Похожие вопросы