我無法準確獲得儘可能多的小數位。如果我輸入6個不同的數字作爲numeric(36,18)
,則在它們之間進行計算,結果值以小數點後6位切斷。如果我使用浮球,我可以走得更遠,但是從我聽到的那些也被切斷了。SQL Server - 數字和浮點型數據類型
任何幫助將是偉大的,謝謝。
我無法準確獲得儘可能多的小數位。如果我輸入6個不同的數字作爲numeric(36,18)
,則在它們之間進行計算,結果值以小數點後6位切斷。如果我使用浮球,我可以走得更遠,但是從我聽到的那些也被切斷了。SQL Server - 數字和浮點型數據類型
任何幫助將是偉大的,謝謝。
精度結果:[P1 - S1 + S2 + MAX(6中,S1 + P2 + 1)] - > 36-18 + 18 + MAX(6,18 + 36 + 1)= 36 + 55 = 91結果比例:[max(6,s1 + p2 + 1)] - > max(6,18 + 36 + 1)= 55在這種情況下,精度大於38,在這種情況下在文檔中說明)
*結果精度和標度的絕對最大值爲38.當結果精度大於38時,對應的標度爲 減小以防止結果的整數部分被截斷。 (91-38 =)53,即(55-53 =)2 ... 最小刻度長度爲6(由於表達式 刻度= [max(6,s1 + p2 + 1)]),並且它不能減小低於6 - ,我們有作爲結果
的事情可能是棘手的,這取決於計算的順序。
考慮變量:
DECLARE @A as NUMERIC(36,19) = 100
DECLARE @B as NUMERIC(36,19) = 480
DECLARE @C as NUMERIC(36,19) = 100
計算A/B * C
如果要計算A/B * C,使用formulaes(@Dudi答案),我們有:
A/B是類型NUMERIC的(38,6)
結果將是0.208333(具有6級)乘以100,我們將得到20.833300
計算A * C/B
的* C的結果是類型NUMERIC(38,6)的10000。用C進行潛水,結果將是NUMERIC類型的20.833333(38,6)
然後,結果可能根據計算順序而變化(在https://dba.stackexchange.com/questions/77664/how-does-sql-server-determine-precision-scale中指出了相同的問題)。
謝謝大家。我不知道這可能會有多複雜。 – hitachi7
顯示您的模式和代碼。 –
爲什麼你認爲結果在6個地方被切斷?也許你的輸出會削減它,但實際的價值是正確的? –
這不是一個SQL Server問題。您需要在Web上搜索大量解釋固定點數據類型('NUMERIC')和浮點數據類型('FLOAT')的行爲,差異和相對優點的文章。這些行爲存在於各種語言中,並且對理解非常有價值。 – MatBailie