2010-02-16 84 views
2

我試圖從類型貨幣兩個變量四捨五入到小數點後3位SQL Server 2008中錢四捨五入爲十進制在SQL Server

DECLARE @Val1 money = 554.5344 
DECLARE @Val2 money = 84020.37 
DECLARE @Result decimal(6,5) = @Val1/@Val2 *100 
SELECT @Result 

上面的結果是0.65。用計算器它是0.65999995001212,我需要的結果是0.659。

回答

2

結果不能0.659 - 四捨五入至5確切的結果地方是0.66000。

而且你不應該用錢分錢:)至少不是直接的;

DECLARE @Val1 money = 554.5344 
DECLARE @Val2 money = 84020.37 
DECLARE @Result decimal(6,5) = cast(@Val1 as float)/@Val2*100 
SELECT @Result 
+0

的確,用金錢劃分貨幣會造成問題,但浮動也會導致不正確的舍入。查看該示例: 選擇5555/CAST(1000 AS浮點數), CAST(5555/CAST(1000 AS浮點數)AS數值(5,2)), 5555/CAST(1000 AS十進制), CAST(5555/CAST(1000 AS十進制)AS數字(5,2)) – user12861 2010-02-16 18:30:26

+0

實際上,對於需要分析的所有情況,我們需要什麼樣的精度以及可能會丟失哪些位置。當我們應該圍繞中間體(大多數金融源數據處理)時,通常固定類型更好;當我們進行某種數學分析時,浮點通常更合適。 – Arvo 2010-02-16 21:58:43

1

如果你想0.659999是「四捨五入」到0.659,你截斷,而不是四捨五入...

此外,你可能想使用標準ROUND function,其可用於截斷爲好。見the answers to this question

+0

由OP提供的計算結果是0.65000 ...而不是0.659999 ... round在這種情況下沒有什麼區別,因爲它取決於正在使用的數據類型。 – AdaTheDev 2010-02-16 13:51:03

+0

@AdaTheDev:我的主要觀點是這個計算是截斷,而不是舍入操作。另外,T-SQL round函數也可以用於截斷。相應地更新我的答案。 – jeroenh 2010-02-16 14:33:02

+0

是的,我同意截斷點。只是在這種情況下,ROUND /單獨截斷並不是答案。如果沒有重點:計算中涉及的數據類型,ROUND /截斷將沒有區別。 – AdaTheDev 2010-02-16 14:42:50

0

要得到相同的結果作爲一個計算器,你需要使用FLOAT,不要錢:

DECLARE @Val1 float 
DECLARE @Val2 float 
SET @Val1= 554.5344 
SET @Val2= 84020.3700 
DECLARE @Result float 
SET @Result = @Val1/@Val2 *100 
SELECT @Result 

給出:0.65999995001212

2

試試這個:

DECLARE @Val1 money = 554.5344 
DECLARE @Val2 money = 84020.37 
DECLARE @Result decimal(6,3) = @Val1 * 100/@Val2 
SELECT @Result 

您的問題是,錢只有4位小數,所以當你通過84020.37劃分554.5344你得到0.0065,所以你在正確的結果,可以按如下方式獲得乘以100得到0.6500。如果你先乘以100,則你除以84020.37得55453.44,得到0.659,這就是你想要的。

0

要獲得小數點後的所有值,您應該使用float。 然後使用round [1]函數。

DECLARE @ VAL1浮
DECLARE @ VAL2浮 SET @ VAL1 = 554.5344 SET @ VAL2 = 84020.3700 DECLARE @Result浮 SET @Result = ROUND(@ VAL1/@ VAL2 * 100,3) SELECT @Result