首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 整數除法截斷陷阱:CAST 為 FLOAT 保留小數完整解法

     編輯:關於SqlServer

現象重現

SELECT 1 / 3;       -- 結果 0 (整數除法截斷)
SELECT 10 / 4;      -- 結果 2 (非 2.5)

SQL Server 兩運算元皆為整數型 (`INT`, `BIGINT`, `SMALLINT`, `TINYINT`) 時,**執行整數除法**,小數部分直接捨棄,不四捨五入。

核心解法:強制型別轉換

將**任一運算元**轉為浮點/定點數型別,即觸發浮點除法:

-- 方法 1:CAST 分子
SELECT CAST(1 AS FLOAT) / 3;      -- 0.333333...

-- 方法 2:CAST 分母
SELECT 1 / CAST(3 AS FLOAT);      -- 0.333333...

-- 方法 3:乘以 1.0 (隱含轉型)
SELECT 1 * 1.0 / 3;               -- 0.333333...

-- 方法 4:使用 DECIMAL 精確控制小數位
SELECT CAST(1 AS DECIMAL(10,4)) / 3; -- 0.3333

實戰範例:欄位除法

-- 錯誤:整數欄位相除
SELECT quantity / price FROM Sales; -- 全部變 0 或整數

-- 正確:轉型分子
SELECT CAST(quantity AS FLOAT) / price FROM Sales;

-- 或轉型分母
SELECT quantity / CAST(price AS FLOAT) FROM Sales;

型別優先級與隱含轉換規則

SQL Server 依資料類型優先順序自動提升較低型別:

sql_variant → xml → datetimeoffset → datetime2 → datetime → smalldatetime → date → time
→ float → real → decimal → money → smallmoney → bigint → int → smallint → tinyint → bit
→ ntext → text → image → timestamp → uniqueidentifier → nvarchar → nchar → varchar → char
→ varbinary → binary

只要運算元包含**優先級較高**的型別 (如 `FLOAT`, `DECIMAL`),另一邊會隱含轉換,**無需顯式 CAST**。但為了可讀性與避免非預期溢位,**建議顯式標註意圖**。

效能與精度權衡

型別精度效能建議場景
FLOAT15 位有效數字 (近似)極快 (硬體支援)科學計算、統計、不需精確貨幣
REAL7 位 (近似)極快單精度足夠場景
DECIMAL(p,s)精確 p 位總數、s 位小數較慢 (軟體模擬)財務、金融、計量、任何不可接受誤差

總結

整數除法截斷是 SQL Server 標準行為。**顯式 `CAST(欄位 AS FLOAT/DECIMAL)`** 是最清晰、最安全的解法。財務系統**嚴禁**使用 `FLOAT/REAL`,請改用 `DECIMAL(19,4)` 或更高精度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved