2012-11-27 4 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を得たが、そこからを何かを取得していない(説明の1から取られた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は2つの可能な値の1つとして扱われます.1 <= n <= 24の場合、nは24として扱われます。 25 <= n <= 53の場合、nは53として扱われます。 MSSQLにFLOAT(n)はありません。別名です。すべての下には、REAL(単精度)またはFLOAT(倍精度)があります。 DBでフォーマットするのではなく、DECIMAL(5、1)にキャストしてください。 STR関数はVARCHARを返します。 – wqw