I подозреваемый что вы спрашиваете здесь, почему:
DECLARE @n real = 201604.125;
SELECT @n;
Возврат 201604.1
?
Первой точкой вызова для подобных вещей должна стать документация: давайте начнем с float и real (Transact-SQL) . Сначала отметим, что:
ISO-синонимом real
является float(24)
.
Если мы посмотрим дальше вниз:
float [(n)] где n - количество битов, которые используются для хранения
мантисса числа с плавающей точкой в научной записи и, следовательно,
диктует точность и размер хранилища. Если указано n, оно должно быть
значение от 1 до 53. Значением по умолчанию для n является 53. Значение n
Precision Storage size
1-24 7 digits 4 bytes
Итак, теперь мы знаем, что real
(он же float(24)
) имеет точность 7. 201604.125
имеет точность 9, это 2 слишком много; так что давай 2 и 5 в возвращаемом значении.
Теперь ROUND (Transact-SQL) . Это заявляет:
Возвращает числовое значение, округленное до указанной длины или точности.
При использовании real
/ float
эти цифры фактически не теряются как таковые из-за плавающей запятой. Когда вы используете ROUND
, вы конкретно указываете: «Я хочу столько десятичных разрядов». Вот почему вы можете увидеть .13
и .125
, как вы специально просили их. Когда вы только что вернули значение @number
, оно имело точность 7, поскольку оно было real
, поэтому 201604.1
было возвращенным значением.