2014-01-16 64 views
3

爲什麼當我做的:小數分頻得到零

select CAST(1 AS DECIMAL(38, 28))/CAST(1625625 AS DECIMAL(38, 28)) 

難道我得到0,但是當我做

select CAST(1 AS DECIMAL(20, 10))/CAST(1625625 AS DECIMAL(20, 10)) 

我得到一個價值?

我本來期望更高精度的分度來返回更高的精度結果,爲什麼不是這樣?

+1

我試着用oracle和它們都返回正確的值。 –

+1

更新了問題 - 這是SQL-Server,我的不好。 Upvoted :) – Faraday

+0

你無能爲力。十進制(38,28)進入浮點區域,FP編號不準確。小數點是「管理」的浮點數,(20,10)正好在可控範圍內,而(38,24)絕對不是!這就是FP號碼的工作原理。查看http://stackoverflow.com/questions/21162624/indexing-float-values-in-python的第一個答案 - 首先回答一個好的概述。 –

回答

3

這是因爲對於數學運算得到的精度和規模與http://msdn.microsoft.com/en-us/library/ms190476.aspx#division

操作
E1/E2

結果精度中的規則計算
p1 - s1 + s2 + max(6,s1 + p2 + 1)

結果規模
MAX(6,S1 + P2 + 1)

所以對於這兩個部分使用decimal(38/28)時,那麼你最終與不支持,因此被截斷decimal(105,67)

另外引述

結果精度和標有38的絕對最大當結果精度大於38時,相應的比例被降低,以防止結果的整數部分從被截斷。

1

作爲替代你總是可以做到這一點,而不是

SELECT CONVERT(DECIMAL(38,28), 1/1625625.0) 

SELECT CONVERT(DECIMAL(10,10), 1/1625625.0) 

SELECT CONVERT(DECIMAL(38,28), 1.0/1625625) 

SELECT CONVERT(DECIMAL(10,10), 1.0/1625625) 

所有4個查詢會導致同樣的結果。如果你不把0放在兩個部分中的任何一個上,它將視爲整數除法,只有結果將被轉換爲十進制。