SQL 中數值型數據截取及四舍五入
例一:
-- 將兩個數值分別截取只保留兩位小數 ( 注意此時字段默認為 decimal )
select CAST ( 10.097 as decimal ( 10, 2)) as [10.097 截取前 ]
, CAST ( 10.094 as decimal ( 10, 2)) as [10.094 截取前 ]
, CAST ( 10.145 as decimal ( 10, 2)) as [10.145 截取前 ]
例二:
-- 再次將兩個數值分別截取只保留兩位小數 ( 注意此時字段類型為 float )
declare @a float , @b float , @c float
set @a = 10.097
set @b = 10.094
set @c = 10.145
select CAST ( @a as decimal ( 10, 2)) as [10.097 截取前 ]
, CAST ( @b as decimal ( 10, 2)) as [10.094 截取前 ]
, CAST ( @c as decimal ( 10, 2)) as [10.145 截取前 ]
在做精度和小數位數的轉換時 ,也要考慮 decimal 和 float 的不同類型字段的區別 。
否則用 Round 函數也是一樣的效果 。
比如 :
declare @a float , @b float , @c float
set @a = 10.097
set @b = 10.094
set @c = 10.145
select ROUND ( @a , 2) as [10.097 進位前 ]
, ROUND ( @b , 2) as [10.094 進位前 ]
, ROUND ( @c , 2) as [10.145 進位前 ]
--result:
10.097 進位前 10.094 進位前 10.145 進位前
---------------------- ---------------------- ----------------------
10.1 10.09 10.14
( 1 行受影響 )
總結 :當字段類型為 float 時 ,進行四舍五入有時會有奇怪的結果產生 ,比如
declare @a float , @b float , @c float
set @a = 0.134
set @b = 0.145
set @c = 0.146
select ROUND ( @a , 2) as [0.134 進位前 ]
, ROUND ( @b , 2) as [0.145 進位前 ]
, ROUND ( @c , 2) as [0.146 進位前 ]
--result:
0.134 進位前 0.145 進位前 0.146 進位前
---------------------- ---------------------- ----------------------
0.13 0.14 0.15
( 1 行受影響 )
當字段類型為 decimal 時 ,對於高精度的小數位四舍五入時 ,並沒有產生那樣奇怪的結果 。比如 :
declare @a decimal ( 5, 3) , @b decimal ( 5, 3) , @c decimal ( 5, 3)
set @a = 0.134
set @b = 0.145
set @c = 0.146
select ROUND ( @a , 2) as [0.134 進位前 ]
, ROUND ( @b , 2) as [0.145 進位前 ]
, ROUND ( @c , 2) as [0.146 進位前 ]
--result:
0.134 進位前 0.145 進位前 0.146 進位前
---------------------- ---------------------- ----------------------
0.130 0.150 0.150
( 1 行受影響 )
所以我們在進行小數位的計算或轉換時 ,我會優先考慮 decimal 類型的數值 。比如 在例一中默認的字段類型即是 decimal ,下面我們來看一下:
--1 、將 0.145 導入臨時表
select 0.145 a
into #a
( 1 行受影響 )
-- 查看臨時表中 a 字段類型
select
[ 表名 ] = c . Name ,
[ 列名 ] = a . Name ,
[ 標識 ] = case when is_identity = 1 then '√' else '' end ,
[ 類型 ] = b . Name
from
sys . columns a
left join
sys . types b on a . user_type_id = b . user_type_id
inner join
sys . objects c on a . object_id = c . object_id
where left( c . Name , 2)= '#a' and a . name = 'a'
-- 結果如下圖示:
所以回看例一 ,在進行數據轉換時 ,默認的字段類型仍是 decimal 。
附圖 數據類型轉換時的行為規范