2009-06-12 89 views
2

我很迷茫通過了如下結果:SQL Server自動舍入?

PRINT 3.1415926535897931 /180 

控制檯結果= 0.01745329251994329500

DECLARE @whatTheHell float(53) 
SET @whatTheHell = 3.1415926535897931/180 
PRINT @whatTheHell 

控制檯結果= 0.0174533

我不明白,因爲提到這一點:

http://msdn.microsoft.com/en-us/library/ms131092.aspx

Sql Server Float應該相當於c#double。 但是當我計算這在C#:

double hellYeah = 3.1415926535897931 /180; 

我得到0.017453292519943295 ...

+0

好的變量名稱。 +1 – 2014-03-21 03:13:02

回答

7

我認爲你得到的事實,PRINT隱式轉換數字與爲STR功能的默認設置字符困惑 - 長度爲10(見MSDN)。試試PRINT STR(@wth, 20, 16),你可能會更開心。

3

我猜「浮動式」只是對精度的限制。聯機叢書用FLOAT(53)說你應該得到15位精度 - 不確定這些數字是否在小數分隔符之前或之後有固有的限制。

嘗試使用十進制來代替:

DECLARE @whatTheHell2 decimal(18,16) 
SET @whatTheHell2 = 3.1415926535897931/180 
PRINT @whatTheHell2 

給我的結果:

0.0174532925199433 

馬克

+0

但是當你閱讀這個msdn文檔時: http://msdn.microsoft.com/en-us/library/ms131092.aspx 你會發現sql float精度等價於c#雙精度。 或者當我用c#計算這個值時: double pipo = 3.1415926535897931/180; 我得到:0.017453292519943295 ??? – Roubachof 2009-06-12 15:30:35

+0

我知道 - 這也讓我感到困惑 - 請參閱其他答案以獲取更多信息。似乎SQL服務器爲FLOAT假定某種默認精度 - 使用NUMERIC或DECIMAL而不是顯式精度設置 – 2009-06-12 15:50:15

+1

Alex Martelli和David B.是對的! – Roubachof 2009-06-12 15:58:26

1

從SQL Server 2005聯機叢書Data Type Conversion話題:

在Transact-SQL語句,一個consta nt 帶小數點時自動將 轉換爲數值數據值, 使用最小精度和 必要的比例。例如,恆 12.345轉換成數值爲5的精度和 規模的3

所以,以下是比較有代表性的是什麼的SQL Server的隱式地做:

DECLARE @whatTheHell NUMERIC(21, 20) 
SET @whatTheHell = 3.1415926535897931/180 
PRINT @whatTheHell 
+0

指的是http://msdn.microsoft.com/en-us/library/ms173773.aspx,float(53)應具有15位數的精度。就像c#double一樣:c#結果確實有15位數字。所以我真的不明白爲什麼我最終的精確度是6位數的浮點數(53)...... – Roubachof 2009-06-12 15:44:34

4

鴻溝不是四捨五入的。打印四捨五入。

DECLARE 
    @var1 float, 
    @var2 float, 
    @var3 float 

SET @var1 = 3.1415926535897931 
SET @var2 = 180 

SET @var3 = @var1/@var2 
SELECT @var1/@var2 as Computed, @var3 as FromVariable 

PRINT @var1/@var2 
PRINT @var3 
0

當你說SQL float映射到C#double時,我認爲你假設SQL float字節大小與C#雙字節大小相同。

我會說C#double是C#中存儲SQL浮點的唯一足夠大的浮點數據類型。

實施例:

C#雙人= 8字節 的Sql浮法= 4個字節

的簡單的辦法解決您的問題是使用十進制或數字在SQL

1

PRINT 3.1415926535897931 /180正被評估爲十進制。

浮點數只能解析爲15位有效數字。你有17個,所以它不能浮動。 180通過由於datatype precedence隱式轉換和輸出標度和精度is based on these rules

輸出0.01745329251994329500具有17個SIG無花果太變爲小數。它必須是十進制的。

現在,SET @whatTheHell = 3.1415926535897931/180。浮點數轉換作爲賦值運算符的一部分進行。在此之前,它也是右側的小數。浮法是近似的,它是四捨五入的。

在C#中它的所有雙打,因爲你沒有固定

相關問題(除非你告訴編譯器):

Choosing the appropriate precision for decimal(x,y)

In SQL how can I convert a money datatype to a decimal?

SQL Server, where clauses comparisons with different types & default casting behaviour