代码之家  ›  专栏  ›  技术社区  ›  Umar Abdullah

带计算的内联声明类型

  •  3
  • Umar Abdullah  · 技术社区  · 7 年前

    我正在用内联声明声明一个变量。问题是输出结果不正确。

    DATA(exact_result) =   50 * ( 2 / 5 ) .
    
    cl_demo_output=>display( exact_result ).
    

    有人能解释一下为什么结果是0吗,其中50*(2/5)=20。

    当做,

    阿卜杜拉

    1 回复  |  直到 7 年前
        1
  •  5
  •   Sandra Rossi    7 年前

    内联声明根据右侧(rhs)表达式中的类型指定数据类型。通过算术表达式,编译器根据 calculation type .

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

    然后,50也被认为是类型i,因为它与另一个i-type数据对象(子表达式2/5的结果是类型i)一起使用,所以结果也是类型i。

    所以,在你的例子中, EXACT_RESULT 被指定为类型I。

    在运行时,因为lhs和rhs数据对象都是i类型,所以计算类型也是i。因此,2/5等于0.4四舍五入为0,因为它是整数除法,默认的abap四舍五入为“上半”(0.4的四舍五入为0,但0.5的四舍五入为1)。

    解决方法是显式定义 精确结果 因为小数点后有数字(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)
    
    推荐文章