2017-07-07 68 views
0

爲什麼SQL Server中的舍入行爲非直觀?SQL Server根據數據類型舍入不同

SELECT CAST( 19.845   AS DECIMAL(18, 2)) AS [DecOK] 
     ,CAST(CAST(19.845 AS FLOAT) AS DECIMAL(18, 2)) AS [DecBad] 
     ,CAST(19.845 AS FLOAT)   AS [Float] 
     ,CAST(19.845 AS FLOAT) - 19.845 AS [NoDiff] 
     ,ROUND( 19.845   , 2) AS [RoundOK] 
     ,ROUND(CAST(19.845 AS FLOAT), 2) AS [RoundBad] 

實際:

DecOK DecBad Float NoDiff RoundOK RoundBad 
19.85 19.84 19.845 0  19.850 19.84 

預計:

DecOK DecBad Float NoDiff RoundOK RoundBad 
19.85 19.85 19.845 0  19.850 19.85 

我期望的值是相同的,而不管數據類型。如何在使用FLOAT時保證準確的結果? NoDiff值是否將第二個值隱式轉換爲FLOAT,這就是爲什麼結果恰好爲0?

+1

https://stackoverflow.com/questions/9526386/rounding-issue-with-sql-server-and-real-datatype – artm

+0

*我怎樣才能保證準確的結果,用浮漂工作時*答案是**大否**。在MSDN中明確指出:「* Float是用於浮點數字數據的近似數字數據類型,浮點數據是近似值;因此,並非數據類型範圍中的所有值都可以精確表示*」 –

回答

0

浮點數是近似的精度。如果你想精確,使用DECIMAL或NUMERIC這是同樣的事情。

這裏有很多帖子,但這裏是一個很棒的帖子。

https://stackoverflow.com/a/7158770

+0

感謝您的。我正在使用一年前創建的現有表格。我將兩個數字相乘,一個保留兩位小數,一位保留三位小數,但保存爲FLOAT。現在我將結果轉換爲DECIMAL(18,5),然後將其轉換爲DECIMAL(18,2)並且舍入是正確的。 –