Встроенное объявление назначает тип данных в зависимости от типа из выражения «Правая сторона» (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)