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**。但為了可讀性與避免非預期溢位,**建議顯式標註意圖**。
| 型別 | 精度 | 效能 | 建議場景 |
|---|---|---|---|
FLOAT | 15 位有效數字 (近似) | 極快 (硬體支援) | 科學計算、統計、不需精確貨幣 |
REAL | 7 位 (近似) | 極快 | 單精度足夠場景 |
DECIMAL(p,s) | 精確 p 位總數、s 位小數 | 較慢 (軟體模擬) | 財務、金融、計量、任何不可接受誤差 |
整數除法截斷是 SQL Server 標準行為。**顯式 `CAST(欄位 AS FLOAT/DECIMAL)`** 是最清晰、最安全的解法。財務系統**嚴禁**使用 `FLOAT/REAL`,請改用 `DECIMAL(19,4)` 或更高精度。