!--a11y-->

算術計算では、算術演算と特殊 ABAP 命令を使用します。
ABAP で は、四則演算と累乗計算がサポートされています。. 算術式で以下の算術演算子を使用することができます。
|
演算子 |
意味 |
|
+ |
加算 |
|
- |
減算 |
|
* |
乗算 |
|
/ |
除算 |
|
DIV |
整数除算 |
|
MOD |
整数除算の余り |
|
** |
累乗 |
算術式で演算子を使用する代わりに、キーワード ADD 、SUBTRACT 、MULTIPLY 、および DIVIDE によって四則演算を実行することができます。
以下の表には、ABAP で四則演算を表現するさまざまな方法が示されています。
|
演算
|
算術式を使用する命令 |
キーワードを使用する命令 |
|
加算 |
<p> = <n> + <m>. |
ADD <n> TO <m>. |
|
減算 |
<p> = <m> - <n>. |
SUBTRACT <n> FROM <m>. |
|
乗算 |
<p> = <m> * <n>. |
MULTIPLY <m> BY <n>. |
|
除算 |
<p> = <m> / <n>. |
DIVIDE <m> BY <n>. |
|
整数除算 |
<p> = <m> DIV <n>. |
--- |
|
除算の余り |
<p> = <m> MOD <n>. |
--- |
|
累乗 |
<p> = <m> ** <n>. |
--- |
キーワードを使用する命令では、演算結果が項目<m> に代入されます。
オペランド<m> 、<n> 、および<p> は任意の数値項目にすることができます。項目のデータ型が異なる場合、すべての項目は、命令内で使用されている最上位階層のデータ型に変換されます。
算術式を使用するとき、演算子 + 、- 、* 、** 、および / と開括弧ならびに閉括弧は、ABAP の用語として解釈されるので、前後に空白を入れる必要があります。
除算演算では、被除数がゼロでない場合、除数をゼロにすることはできません。整数除算では、演算子 / の代わりに DIV または MOD を使用します。DIV では整数の商が算出され、MOD では余りが算出されます。
算術式を組み合わせると、ABAP では左から右に計算が行われます。ただし、唯一の例外として、累乗は右から左に計算されます。したがって、<n> ** <m> ** <p> は <n> ** ( <m> ** <p> ) と同じですが、( <n> ** <m> ) ** <p> とは異なります。

DATA: COUNTER TYPE I.
COMPUTE COUNTER = COUNTER + 1.
COUNTER = COUNTER + 1.
ADD 1 TO COUNTER.
この場合、3 つの操作命令で同じ算術演算が実行されます。つまり、項目 COUNTER の内容に 1 が加算されて、その結果が COUNTER に代入されます。

DATA: PACK TYPE P DECIMALS 4,
N TYPE F
VALUE '+5.2',
M TYPE F
VALUE '+1.1'.
PACK = N / M.
WRITE PACK.
PACK = N DIV M.
WRITE / PACK.
PACK = N MOD M.
WRITE /PACK.
出力は以下のようになります。
4.7273
4.0000
0.8000
この例には、各種の除算が示されています。
MOVE-CORRESPONDING 命令を使用して、構造間でコンポーネントごとに値を転送する場合と同様に、以下の命令によって、構造のコンポーネント間で算術演算を行うこともできます。
キ ADD-CORRESPONDING
キ SUBTRACT-CORRESPONDING
キ MULTIPLY-CORRESPONDING
キ DIVIDE-CORRESPONDING
ABAP では、両方の構造で名称が同じであるすべてのコンポーネントに対し、該当する計算が行われます。ただし、すべての関連コンポーネントが数値データ型である場合のみ、演算する意味があります。

DATA: BEGIN OF RATE,
USA TYPE F VALUE '0.6667',
FRG TYPE F VALUE '1.0',
AUT TYPE F VALUE '7.0',
END OF
RATE.
DATA: BEGIN OF MONEY,
USA TYPE I VALUE 100,
FRG TYPE I VALUE 200,
AUT TYPE I VALUE 300,
END OF MONEY.
MULTIPLY-CORRESPONDING MONEY BY RATE.
WRITE / MONEY-USA.
WRITE / MONEY-FRG.
WRITE / MONEY-AUT.
出力は以下のようになります。
67
200
2,100
ここでは、MONEY-USA が RATE-USA と掛け算され、その他のコンポーネントも同様に掛け算されます。
ADD 命令には、メモリ内の項目シーケンスを加算することのできる記述法があります。以下の例があります。
項目シーケンスを加算し、その結果を別項目に代入する場合:
ADD <n1> THEN <n2> UNTIL <nz> GIVING <m>.
<n1> 、<n2> 、... 、<nz> が、データ型と長さが同じであり、メモリ内の一連の等距離項目である場合、これらのシーケンスを集計し、その結果を <m> に代入することができます。
項目シーケンスを加算し、その結果を別項目の内容に加算する場合:
ADD <n1> THEN <n2> UNTIL <nz> TO <m>.
この命令は、項目の合計が <m> の既存内容に加算される点だけを除き、前の命令と同じです。
その他の類似した記述法の追加情報については、ADD 命令のキーワード文書を参照してください。

DATA: BEGIN OF SERIES,
N1
TYPE I VALUE 10,
N2
TYPE I VALUE 20,
N3
TYPE I VALUE 30,
N4
TYPE I VALUE 40,
N5
TYPE I VALUE 50,
N6
TYPE I VALUE 60,
END OF SERIES.
DATA SUM TYPE I.
ADD SERIES-N1 THEN SERIES-N2 UNTIL SERIES-N5 GIVING
SUM.
WRITE SUM.
ADD SERIES-N2 THEN SERIES-N3 UNTIL SERIES-N6 TO
SUM.
WRITE / SUM.
以下が出力されます。
150
350
この場合、コンポーネント N1 から N5 までの内容が集計され、項目 SUM に代入されます。次に、コンポーネント N2 から N6 までの内容が集計され、項目 SUM の値に加算されます。
