abap - 带计算的内联声明类型

标签 abap

我正在声明一个带有内联声明的变量 50 * ( 2 / 5 ) .问题是输出结果是0而不是预期的 20 .

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

cl_demo_output=>display( exact_result ).
任何人都可以建议为什么结果为零,因为 50 * (2/5) = 20。
问候,
奥马尔·阿卜杜拉

最佳答案

内联声明根据右侧 (RHS) 表达式的类型分配数据类型。使用算术表达式,编译器根据整体calculation type 确定数据类型。 .

首先,2 和 5 被视为类型 I(4 字节整数),因此即使运算符是除法(在这种情况下为整数除法),结果也是 I 类型。

然后,50 也被视为类型 I,并且因为它与另一个 I 类型数据对象(类型 I 的子表达式 2/5 的结果)一起使用,所以结果也是类型 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 的类型具有更高的优先级(我),因此计算将根据 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)

关于abap - 带计算的内联声明类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53919788/

相关文章:

event-handling - ABAP:CL_SIMPLE_TREE_MODEL 的事件 CONTEXT_MENU_SELECT - 无法触发它

abap - 按下退出键时如何关闭模式弹出窗口

abap - 如何在结构体中声明表类型?

abap - 确定 RFC 调用者?

types - 主程序无法识别 INCLUDE 中的声明

abap - 如何在 IF 条件下使用 ABAP bool 值?

customization - SAP R/3标准代码修改的手段?

abap - 更新数据库记录时where子句出现问题

abap - 方法导入参数类型范围任意

c# - asp.net 网页上的 BAPI 函数回滚