SQL 中數值型數據截取以及四舍五入


 

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 。

 

附圖 數據類型轉換時的行為規范

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM