2016-02-23 79 views
1

我有一個問題讓我的「四捨五入到小數點後兩位」表現得如我所料。 試試這個簡單的例子Sql服務器四捨五入問題下降到小數點後兩位

declare @num numeric (18,2) 
declare @vat numeric (18,2) 
set @num = 11729.83 
set @vat = 1.14 
select round(@num/@vat,2) 

我得到的10289.320000的答案,但我應該得到10289.33。完全去圓數爲10289.324561403508771929824561404(除非我的數學是完全關閉)

+4

'10289.324' => 10289.32'小數點後的第三位是4,所以它被舍入下來 – lad2025

+0

我確信我記得高中時, 6導致5導致4四捨五入,並導致2四捨五入 – Crudler

+0

評論d ownvote請願? – Crudler

回答

0

試試這個

select cast(round(@num/@vat,3) as decimal(18,2)) 
1

嘗試轉換爲十進制:

select cast(round(@num/@vat, 2) as numeric(18, 2)) 

我主張round()要更明確一些轉換方法。

+0

SQL Server在轉換期間舍入或截斷取決於您要轉換和來自的內容。如果您要從數字類型轉換爲數字類型,那麼它會四捨五入。一個簡單的例子是'SELECT CAST(1.235 AS DECIMAL(10,2))',它產生1.24,而不是1.23,這將是截斷的結果。雖然,我實際上仍然主張使用round,因爲意圖比依賴某人知道如何使用不同數據類型執行cast/convert行爲更清晰。 – GarethD

+0

@GarethD。 。 。你很正確。我沒有檢查使用該工具;我查看了convert()的文檔。而且,第一個引用說'convert()'會截斷。 。 。但那是爲了字符串。 Arrghh。後來,它說數字值是四捨五入的,就像你說的那樣。謝謝。 –

-1

我不知道我是否理解正確。但是,也許你一直在尋找這樣的事情:

select round(round(round(round(@num/@vat, 5), 4), 3), 2) 
+0

要求是不同的 – Moumit

-1

您將需要再次轉換爲相應的十進制類型:

SELECT CONVERT(DECIMAL(18,2), ROUND(@NUM/@VAT,2)) 
0

試試這個

declare @num numeric (18,2) 
declare @vat numeric (18,2) 
set @num = 11729.83 
set @vat = 1.14 
select round(Convert(Decimal(18,3),(@num/@vat)),2) 
1

Roun d可以返回低於原始值的值或比原始值高的值。實際上它會返回最接近原始值的值。

如果你想系統地輪數的下限或上限數值,然後你可以使用地板或天花板(感謝@GarethD刷新我在天花板上的記憶...)

select round(floor(100*@num/@vat)/100,2) -> lower value 
select round(ceiling(100*@num/@vat)/100,2) -> upper value 

否則輪將當數值嚴格低於10289.325(這裏就是這種情況)時,確實返回10289.32

+0

當然你會使用'CEILING'來收集? – GarethD

+0

是的!天花板!!!我忘了這個!謝謝。我相應地更新了 –