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

Abap 如果将类型解析留给编译器,为什么会丢失精度?,abap,netweaver,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

如果变量的十进制类型由编译器定义,那么精度损失的原因是什么?这有文件记录吗

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


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

如果操作数指定为泛型字段符号或形式 参数和内联声明
DATA(var)
用作目标 字段中,泛型类型静态地对 可检测的计算类型(用于确定 声明)如下:

c顺序、clike、c、n和p类似于p。如果未涉及具有更高优先级的类型,则声明将使用长度为8的p类型(无小数位数)。

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


谢谢你的回答。但这似乎真的很危险|在我看来,如果有人需要精确性,最好使用所有预期的小数显式定义类型。我通常更喜欢键入变量。@贾格尔,不客气。并毫不犹豫地将答案标记为正确^)