2

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

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

4

1 回答 1

4

众所周知,ABAP 编译器将算术表达式的所有操作数都带入了所谓的计算类型。而且我们也知道,取值范围最大的数据类型决定了整个计算类型。
但是,您可能不知道随着 ABAP 中内联声明的发布,此过程中引入了一些更改。他们来了:

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

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

在此处输入图像描述

于 2016-04-08T15:28:07.493 回答