2016-04-08 52 views
2

如果變量的十進制類型由編譯器定義,則精度丟失的原因是什麼?這是記錄在任何地方?如果解析編譯器的類型,爲什麼會丟失精度?

DATA: gv_1 TYPE p LENGTH 15 DECIMALS 2 VALUE '56555.31'. 
DATA: gv_2 TYPE p LENGTH 15 DECIMALS 2 VALUE '56555.31'. 
DATA: gv_3 TYPE p LENGTH 15 DECIMALS 2 VALUE '56555.34'. 

DATA(gv_sum) = gv_1 + gv_2 + gv_3. "data type left to be resolved by the compiler 

WRITE/gv_sum. 

DATA: gv_sum_exp TYPE p LENGTH 15 DECIMALS 2. "explicit type declaration 
gv_sum_exp = gv_1 + gv_2 + gv_3. 

WRITE/gv_sum_exp. 

第一總和結果

第二個在

169665.96

回答

4

作爲我們知道,ABAP編譯器會將算術表達式的所有操作數引入所謂的calculation type。而且我們也知道數據類型的最大值範圍決定了整個caclulation類型。
但是,您可能並不知道通過在ABAP中發佈內聯聲明引入了此過程的一些更改。它們是:

如果操作數被指定爲一般類型化字段符號或正式 參數和內聯聲明DATA(var)用作賦值的目標 字段,通用類型向靜態 檢測計算類型(用於確定 聲明的數據類型):
...
csequence,clike,c,n和p類似於p。如果沒有涉及更高優先級的類型,長度爲8的類型p12無小數位數)用於聲明。
...

這正是我們代碼的執行過程中的調試器看到:

enter image description here

+1

感謝您的回答。這似乎是非常危險的。 :| – Jagger

+0

對我來說似乎是,如果有人需要精確度,最好用所有預期的小數來明確定義類型。我通常更喜歡鍵入我的變量。 –

+0

@Jagger,不客氣。並且不要猶豫將答案標記爲正確^) – Suncatcher

相關問題