DB2之DECIMAL小數字數導致的乘法溢位

2021-05-27 19:01:35 字數 688 閱讀 1651

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位,表示圓的面積。說明 在本題中,輸入是乙個整數,但是輸出是乙個實數。對於實數輸出的問題,請一定看清楚實數輸出的要求,比如本題中要求保留小數...