decimal值型別最長為31位,它在做乘法運算的時候,會將小數字數自動加和而擠占整數字,直到擠占完畢導致結果溢位。
比如a:decimal(24,6) ;b:decimal(24,6);則a*b的結果是decimal(31,12)
比如a:decimal(5,2) ;b:decimal(6,3);則a*b的結果是decimal(11,5)
依次類推,如果有5個decimal(24,6)乘數相乘,乘法的結果為30位小數,如果此時再繼續乘以某個數值使其結果大於1,db2將擠占直到31位小數db2 也將報錯:
select 1.1*cast(1 as decimal(24,6))*cast(1 as decimal(24,6))*cast(1 as decimal(24,6))*cast(1 as decimal(24,6))*cast(1 as decimal(24,6)) from business_contract fetch first 1 rows only
sqlstate 22003: a numeric value is out of range.
sql0802n 發生算術溢位或其他算術異常。 sqlstate=22003
不信各位可以試試。
解決的辦法是,在每一次乘法計算完畢後,都對計算結果進行一下 cast()修正,
如:cast(6.02*3.36 as decimal(24,2))
關於DB2除法的小數字問題
今天在做db2測試的時候發現乙個問題 select 1 3 from sysibm.sysdummy1 結果得到 0!鬱悶,怎麼會這樣。後來仔細查了一下db2的資料,發現db2的算術運算是遵循一下規則 argument1 argument2 result decimal a,b decimal c,...
BigDecimal設定小數字數
public static void main string args bigdecimal x new bigdecimal 2.22262222222222222222222222 setscale 3,bigdecimal.round half up system.out.println x....
固定小數字數 setprecision
藍橋入門2 圓的面積 問題描述 給定圓的半徑r,求圓的面積。輸入格式 輸入包含乙個整數r,表示圓的半徑。輸出格式 輸出一行,包含乙個實數,四捨五入保留小數點後7位,表示圓的面積。說明 在本題中,輸入是乙個整數,但是輸出是乙個實數。對於實數輸出的問題,請一定看清楚實數輸出的要求,比如本題中要求保留小數...