SQL 保留兩位小數的實現方式

2021-10-01 19:46:20 字數 2150 閱讀 4104

問題:分析:

首先檢視資料庫中的資料定義,均為decimal(12,2) ,直接通過資料庫查詢的結果也會保留兩位小數,但是**處理後,卻會忽略掉最後乙個「零」位。

此處有兩個解決方案:

一、 **中處理,檢測到為金額字段,做特殊處理;二、修改查詢sql語句去規避此問題; 第一種方法,無論通過資料型別還是欄位名稱,都不好判斷是否為金額,故選用第二種方法。

sql中保留兩位小數的方法有三種,(第2、3種方法類似):

1、使用round()函式,round返回乙個數值,捨入到指定的長度或精度,使用示例:

select

round(123.9994, 3) --

123.9990

select

round(123.9995, 3) --

124.0000

select

round(748.584, -

1) --

750.000

select

round(748.586, -

2) --

700.000

select

round(748.586, -

3) --

error 將expression轉換為資料型別 numeric 時出現算術溢位錯誤

select

round(748.586, -

4) --

0.000,如果length為負數,並且大於小數點前的數字個數,則round將返回 0

select

round(151.75, 0,0) --

152.00 捨入

select

round(151.75, 0,1) --

151.00 截斷

2、使用convert()函式,使用示例:

select

convert(decimal(13,2),13.123) --

13.12

3、使用cast()函式,使用示例:

select

cast(13.123

asdecimal(13,2)) --

13.12

這三種方法(其實是兩種),還是有區別的,區別在於round()只是進行四捨五入,仍然會保留後面的位數為0,但是convert()和cast() 卻會截斷後面的位數,示例:

select

convert(decimal(13,2),13.123) --

13.12

select

cast(13.123

asdecimal(13,2)) --

13.12

select

round(13.123,2) --

13.120

根據需求這裡採用第2種方案,但是僅這樣處理還是不夠的,返回的float型,經過**處理後,仍然會捨去最後的"0"位。

最終的解決方案為:資料庫查詢時,把float型資料轉換為字元型,再交由**處理返回給客戶端。

具體實現為:

select

rtrim(convert(decimal(13,2),13.123))

附rtrim()的用法,返回刪除了尾隨空格的字元表示式。:

rtrim(character expression)

示例:

select

rtrim('

hello

')+'%'

--hello%

select

rtrim('

hello

')+'%'

--hello%

select

rtrim('

hello '+

''+'world

')+'%'

--helloworld%

select

rtrim('

hello '+

''+'world

')+'%'

--hello world%

select

rtrim('

hello'+

''+'

world

')+'%'

--hello world%

SQL 保留兩位小數的實現方式

問題 分析 首先檢視資料庫中的資料定義,均為decimal 12,2 直接通過資料庫查詢的結果也會保留兩位小數,但是 處理後,卻會忽略掉最後乙個 零 位。此處有兩個解決方案 一 中處理,檢測到為金額字段,做特殊處理 二 修改查詢sql語句去規避此問題 第一種方法,無論通過資料型別還是欄位名稱,都不好...

Sql 保留兩位小數

sql中欄位保留兩位小數 使用round 函式,如round number,2 其中引數2表示保留兩位有效數字,但是只負責四捨五入到兩位小數,但是不負責截斷 例如round 3.141592653,2 結果為3.140000000 使用convert decimal 10,2 number 實現轉換...

SQL保留兩位小數用法

sql server中除法,會遇到除數為0的情況,且保留兩位小數,寫法如下 select case when num 0 then 0 else convert decimal 18,2 210.343 num end as 結果 from tabnumber select carrier as 承...