我正在声明一个带有内联声明的变量 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/