Тип встроенной декларации с расчетом - PullRequest
0 голосов
/ 25 декабря 2018

Я объявляю переменную со встроенным объявлением.Проблема в том, что результат вывода неверен.

DATA(exact_result) =   50 * ( 2 / 5 ) .

cl_demo_output=>display( exact_result ).

Может кто-нибудь подсказать, почему результат равен нулю, где 50 * (2/5) = 20.

С уважением,

Умар Абдулла

1 Ответ

0 голосов
/ 25 декабря 2018

Встроенное объявление назначает тип данных в зависимости от типа из выражения «Правая сторона» (RHS).С помощью арифметического выражения компилятор определяет тип данных на основе общего типа вычисления .

Во-первых, 2 и 5 рассматриваются как тип I (4-байтовое целое число), поэтому результат равентакже типа I, даже если оператор является делением (целочисленное деление в этом конкретном случае).

Тогда 50 также рассматривается как тип I, и потому что он используется с другим объектом данных типа I (результатподвыражение 2/5, которое имеет тип I), результат также имеет тип I.

Итак, в вашем примере EXACT_RESULT присваивается тип I.

Во время выполнения, потому чтооба объекта данных LHS и RHS относятся к типу I, тогда тип расчета также I.Следовательно, 2/5 равно 0,4, что округляется до 0, потому что это целочисленное деление, а округление ABAP по умолчанию равно «половине» (округление 0,4 дает 0, но 0,5 дает 1).

Обходной путь кявно определите тип данных EXACT_RESULT как имеющий цифры после десятичной точки (DECFLOAT16, DECFLOAT34, тип P с десятичными знаками, F и даже C, потому что тогда тип вычисления - P!), потому что тип LHS будет иметь более высокийприоритет, чем тип RHS (I), поэтому расчет будет выведен из типа переменной LHS.

DATA(exact_result) = CONV decfloat16( 50 * ( 2 / 5 ) ).

Будьте осторожны с этим следующим решением: как я уже сказал, C приводит к вычислению с типом P и множеством десятичных знаков, поэтому мы могли бы подумать, что этот пример является хорошим решением:

DATA(exact_result) = '50' * ( 2 / 5 ). " equals 20

Но с помощью встроенных объявлений тип вычисления P приводит к объекту данных типа P но с 0 цифрами после десятичной точки, поэтому результат усекается с другими числами (8 вместо 50 здесь):

DATA(exact_result) = '8' * ( 2 / 5 ). " rounded ! (3 instead of 3.2)
...