1.1. 基本數據類型
C、N、D、T、I、F、P、X、string、Xstring
P:默認為8字節,最大允許16字節。最大整數位:16*2 = 32 - 1 = 31 -14(允許最大小數位數) = 17位整數位
類型 |
最大長度(字符數) |
默認長度 |
說明 |
C |
1~262143個字符 |
1 字符 |
|
N |
1~262143個字符 |
1 字符 |
0到9之間字符組成的數字字符串 |
D |
8 個字符 |
|
日期格式必須為 YYYYMMDD |
T |
6 個字符 |
|
格式為 24-hour的 HHMMSS |
I |
4 bytes |
|
-2.147.483.648 to +2.147.483.647 |
F |
8 bytes |
|
小數位最大可以到17位,即可精確到小數點后17位 |
P |
1 to 16 bytes |
8 bytes |
兩個數字位壓縮后才占一個字節,由於0-9的數字只需要4Bit位,所以一個字節實質上允許存儲二位數字,這就是P數據類型為壓縮數據類型的由來。並借用半個字節來存儲小數點位置、正號、負號相關信息 |
X |
1~524,287 bytes |
1 byte |
十六進制字符 0-9, A-F具體的范圍為:00~FF 類型X是十六進制類型,可表示內存字節實際內容,使用兩個十六制字符表示一個字節中所存儲的內容。但直接打印輸出時,輸出的還是賦值時字面意義上的值,而不是Unicode解碼后的字符 如果未在 DATA 語句中指定參數<length>,則創建長度為 1 注:如果值是字母,則一定要大寫 |
1.1.1. P類型(壓縮型)數據
是一種壓縮的定點數,其數據對象占據內存字節數和數值范圍取定義時指定的整個數據大小和小數點后位數,如果不指定小數位,則將視為I類型。其有效數字位大小可以是從1~31位數字(小數點與正負號占用一個位置,半個字節),小數點后最多允許14個數字。
P類型的數據,可用於精確運算(這里的精確指的是存儲中所存儲的數據與定義時字面上所看到的大小相同,而不存在精度丟失問題——看到的就是內存中實實在在的大小)。在使用P類型時,要先選擇程序屬性中的選項 Fixed point arithmetic(即定點算法,一般默認選中),否則系統將P類型看用整型。其效率低於I或F類型。
"16 * 2 = 32表示了整個字面意義上允許的最大字面個數,而14表示的是字面上小數點后面允許的最大小數位,而不是指14個字節,只有這里定義時的16才表示16個字節
DATA: p(16) TYPE p DECIMALS 14 VALUE '12345678901234567.89012345678901'.
"正負符號與小數點固定要占用半個字節,一個字面上位置,並包括在這16個字節里面。
"16 * 2 = 32位包括了小數點與在正負號在內
"在定義時字面上允許最長可以達到32位,除去小數點與符號需占半個字節以后
"有效數字位可允許31位,這31位中包括了整數位與小數位,再除去定義時小
"數位為14位外,整數位最多還可達到17位,所以下面最多只能是17個9
DATA: p1(16) TYPE p DECIMALS 14 VALUE '-99999999999999999'.
"P類型是以字符串來表示一個數的,與字符串不一樣的是,P類型中的每個數字位只會占用4Bit位,所以兩個數字位才會占用一個字節。另外,如果定義時沒有指定小數位,表示是整型,但小數點固定要占用半個字節,所以不帶小數位與符號的最大與最小整數如下(最多允許31個9,而不是32個)
DATA: p1(16) TYPE p VALUE '+9999999999999999999999999999999'.
DATA: p2(16) TYPE p VALUE '-9999999999999999999999999999999'.
其實P類型是以字符串形式來表示一個小數,這樣才可以作到精確,就像Java中要表示一個精確的小數要使用BigDecimal一樣,否則會丟失精度。
DATA: p(9) TYPE p DECIMALS 2 VALUE '-123456789012345.12'.
WRITE: / p."123456789012345.12-
DATA: f1 TYPE f VALUE '2.0',
f2 TYPE f VALUE '1.1',
f3 TYPE f.
f3 = f1 - f2."不能精確計算
"2.0000000000000000E+00 1.1000000000000001E+00 8.9999999999999991E-01
WRITE: / f1 , f2 , f3.
DATA: p1 TYPE p DECIMALS 1 VALUE '2.0',
p2 TYPE p DECIMALS 1 VALUE '1.1',
p3 TYPE p DECIMALS 1.
p3 = p1 - p2."能精確計算
WRITE: / p1 , p2 , p3. "2.0 1.1 0.9
Java中精確計算:
publicstaticvoid main(String[] args) {
System.out.println(2.0 - 1.1);// 0.8999999999999999
System.out.println(sub(2.0, 0.1));// 1.9
}
publicstaticdouble sub(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}
1.2. TYPE、LIKE
透明表(還有其它數據詞典中的類型,如結構)即可看作是一種類型,也可看作是對象,所以即可使用TYPE,也可以使用LIKE:
TYPES type6 TYPE mara-matnr.
TYPES type7 LIKE mara-matnr.
DATA obj6 TYPE mara-matnr.
DATA obj7 LIKE mara-matnr.
"SFLIGHT為表類型
DATA plane LIKE sflight-planetype.
DATA plane2 TYPE sflight-planetype.
DATA plane3 LIKE sflight.
DATA plane4 TYPE sflight.
"syst為結構類型
DATA sy1 TYPE syst.
DATA sy2 LIKE syst.
DATA sy3 TYPE syst-index.
DATA sy4 LIKE syst-index.
注:定義的變量名千萬別與詞典中的類型相同,否則表面上即可使用TYPE也可使用LIKE,就會出現這兩個關鍵字(Type、Like)都可用的奇怪現像,下面是定義一個變量時與詞典中的結構同名的后果(導致)
DATA : BEGIN OF address2,
street(20) TYPE c,
city(20) TYPE c,
END OF address2.
DATA obj4 TYPE STANDARD TABLE OF address2."這里使用的實質上是詞典中的類型address2
DATA obj5 LIKE STANDARD TABLE OF address2."這里使用是的上面定義的變量address2
上面程序編譯通過,按理obj4定義是通過不過的(只能使用LIKE來引用另一定義變量的類型,TYPE是不可以的),但由於address2是數字詞典中定義的結構類型,所以obj4使用的是數字詞典中的結構類型,而obj5使用的是LIKE,所以使用的是address2變量的類型