爲什麼當我做的:小數分頻得到零
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))
我得到一個價值?
我本來期望更高精度的分度來返回更高的精度結果,爲什麼不是這樣?
爲什麼當我做的:小數分頻得到零
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))
我得到一個價值?
我本來期望更高精度的分度來返回更高的精度結果,爲什麼不是這樣?
這是因爲對於數學運算得到的精度和規模與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時,相應的比例被降低,以防止結果的整數部分從被截斷。
作爲替代你總是可以做到這一點,而不是
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放在兩個部分中的任何一個上,它將視爲整數除法,只有結果將被轉換爲十進制。
我試着用oracle和它們都返回正確的值。 –
更新了問題 - 這是SQL-Server,我的不好。 Upvoted :) – Faraday
你無能爲力。十進制(38,28)進入浮點區域,FP編號不準確。小數點是「管理」的浮點數,(20,10)正好在可控範圍內,而(38,24)絕對不是!這就是FP號碼的工作原理。查看http://stackoverflow.com/questions/21162624/indexing-float-values-in-python的第一個答案 - 首先回答一個好的概述。 –