2012-11-27 10 views
11

In SQL Server 2005 str() si comporta in modo strano su alcuni valori float durante l'arrotondamento. Durante la ricerca in rete, ho trovato il codice qui sotto e le spiegazioni lì.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 

ho avuto alcune spiegazioni here e here, ma non ha ottenuto nulla da lì (che sopra T-SQL tratto da una delle spiegazioni link)

Qualcuno potrebbe spiegare perché si comporta come questo?

risposta

5

Sintassi di STR(); STR (float_expression [ , length [ , decimal ] ]) dice chiaramente che il numero è . Pertanto, qualunque sia il numero che fornirete verrà prima convertito in FLOAT(n) dove valore predefinito di n = 53.

Così

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

pari a:

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

Se si specifica n, dicono n = 4 vi darà la risposta vi aspettate (ie; 4.7 e 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

spiegazione piacevole. Grazie. –

+0

@ M.Kumaran: se pensi che questo sia una risposta, Mark accetta ... –

+0

da BOL: "SQL Server considera n come uno dei due valori possibili: se 1 <= n <= 24, n viene trattato come 24. Se 25 <= n <= 53, n viene trattato come 53. " Non c'è FLOAT (n) in MSSQL, è un alias. Sotto tutto è REAL (precisione singola) o FLOAT (precisione doppia). Migliore cast TO DECIMAL (5, 1) invece di formattazione nel DB. La funzione STR restituisce VARCHAR. – wqw