我正在用内联声明声明一个变量。问题是输出结果不正确。
DATA(exact_result) = 50 * ( 2 / 5 ) .
cl_demo_output=>display( exact_result ).
谁能建议为什么结果为零,因为50 *(2/5)= 20。
致谢
乌马尔·阿卜杜拉
答案 0 :(得分:5)
内联声明根据右侧(RHS)表达式中的类型分配数据类型。借助算术表达式,编译器根据整体calculation type确定数据类型。
首先,将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舍入为“ half up”(舍入为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)