gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:14:43 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com