如果将类型解析为编译器,为什么精度会丢失?

时间:2016-04-08 14:06:31

标签: abap netweaver

如果变量的十进制类型由编译器定义,那么精度丢失的原因是什么?这是在任何地方记录的吗?

DATA: gv_1 TYPE p LENGTH 15 DECIMALS 2 VALUE '56555.31'.
DATA: gv_2 TYPE p LENGTH 15 DECIMALS 2 VALUE '56555.31'.
DATA: gv_3 TYPE p LENGTH 15 DECIMALS 2 VALUE '56555.34'.

DATA(gv_sum) = gv_1 + gv_2 + gv_3. "data type left to be resolved by the compiler

WRITE / gv_sum.

DATA: gv_sum_exp TYPE p LENGTH 15 DECIMALS 2. "explicit type declaration
gv_sum_exp = gv_1 + gv_2 + gv_3.

WRITE / gv_sum_exp.

第一笔结果为

  

169666

中的第二个
  

169665.96

1 个答案:

答案 0 :(得分:4)

众所周知,ABAP编译器将算术表达式的所有操作数都带到所谓的calculation type。我们还知道具有最大值范围的数据类型决定了整个caclulation类型。
但是,您可能不知道在ABAP中发布内联声明时对此过程引入了一些更改。他们在这里:

  

如果操作数被指定为通用类型字段符号或正式   参数和内联声明DATA(var)用作目标   在赋值字段中,泛型类型对静态有贡献   可检测的计算类型(用于确定数据的类型)   声明)如下:
... ... csequence,clike,c,n和p like p。如果不涉及具有更高优先级的类型,类型p,长度为8 无小数位)用于声明。
...

这正是我们在执行代码时在调试器中看到的:

enter image description here