SQL Server 2005: str (4.65,5,1) = 4,7, str (3,65,5,1) = 3,6?

В SQL Server 2005 str() ведет себя странно при некоторых значениях float при округлении. При поиске в сети я нашел ниже код и пояснения.

select STR(4.65,5,1) -- it will give 4.7
select STR(3.65,5,1) -- it will give 3.6

Я получил некоторые объяснения здесь и здесь, но не получил оттуда ничего (что выше T-SQL взято из одной из ссылок объяснений)

Может ли кто-нибудь объяснить, почему он ведет себя так?

Ответ 1

Синтаксис STR(); STR ( float_expression [ , length [ , decimal ] ] ) ясно говорит, что число равно float_expression. Поэтому независимо от того, какое число вы дадите, сначала преобразуется в FLOAT(n), где значение по умолчанию n = 53.

So

SELECT STR(4.65,5,1), SELECT STR(3.65,5,1)  

Равно:

SELECT STR(CAST(4.65 AS FLOAT(53)),5,1) , STR(CAST(3.65 AS FLOAT(53)),5,1)

Если вы укажете n, скажем n = 4, он даст ответ, который вы ожидаете (т.е. 4.7 и 3.7)

SELECT STR(CAST(4.65 AS FLOAT(4)),5,1) , STR(CAST(3.65 AS FLOAT(4)),5,1)
              --4.7,                     3.7