2012-11-27 73 views
11

在SQL Server 2005中,str()在舍入時對某些浮點數值表現出奇怪的現象。在網上搜索時,我在那裏找到了下面的代碼和解釋。SQL Server 2005:str(4.65,5,1)= 4.7,str(3.65,5,1)= 3.6?

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

我得到了一些解釋herehere,但並沒有從那裏(即從以上的解釋之一採取T-SQL鏈接)得到任何

任何人都可以請解釋爲什麼它的行爲喜歡這個?

回答

5

STR()的語法; STR (float_expression [ , length [ , decimal ] ])明確表示該號碼是float_expression。因此,無論您給它的數量是多少,都會首先轉換爲FLOAT(n),其中默認值爲n = 53

所以

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 
+0

很好的解釋。謝謝。 –

+0

@ M.Kumaran:如果您認爲這是答案,請將其標記爲... –

+0

來自BOL:「SQL Server將n視爲兩個可能值之一,如果1 <= n <= 24,則n被視爲24。如果25 <= n <= 53,則n被視爲53.「 MSSQL中沒有FLOAT(n),它是一個別名。在一切下面是REAL(單精度)或FLOAT(雙精度)。更好地轉換爲DECIMAL(5,1)而不是在數據庫中格式化。 STR函數返回VARCHAR。 – wqw