我在这里遇到了一个问题,我无法确切知道SAP在做什么。测试非常简单,我有两个完全不同类型的变量以及两个完全不同的值。

输入是INT4,值为23579235。我正在针对字符串'23579235.43'测试相等性函数。显然,我的期望是这两个变量是不同的,因为它们不仅不是同一类型的变量,而且它们的值也不相同。实际上,它们之间没有什么相似。

EXPECTED1 23579235.43   C(11)   \TYPE=%_T00006S00000000O0000000302
INDEX1    23579235      I(4)    \TYPE=INT4


但是,cl_abap_unit_assert=>assert_equals返回这两个值相同。我开始调试,发现使用'EQ'语句检查值,并且在简单的ABAP中运行相同的语句也为该比较返回'true'。

unit-testing - 对于INT4和CHAR数字,ABAP相等性检查错误-LMLPHP

这是怎么回事,为什么在注意到两种数据类型甚至不相同后,检查立即失败?这是我的错误,还是这些断言类不正确?

report ztest.
if ( '23579235.43' eq 23579235 ).
  write: / 'This shouldn''t be shown'.
endif.


unit-testing - 对于INT4和CHAR数字,ABAP相等性检查错误-LMLPHP

最佳答案

正如@dirk所说,ABAP隐式转换比较或分配的变量/文字(如果它们具有不同的类型)。

首先,ABAP决定将C类型文字转换为I类型,以便可以将其与其他I文字进行比较,而不能相反,因为在比较C类型和I类型时存在此优先级规则:https://help.sap.com/http.svc/rc/abapdocu_752_index_htm/7.52/en-US/abenlogexp_numeric.htm#@@ITOC@@ABENLOGEXP_NUMERIC_2

               | decfloat16, decfloat34 | f | p | int8 | i, s, b |
.--------------|------------------------|---|---|------|---------|
| string, c, n | decfloat34             | f | p | int8 | i       |


(“ c”和“ i”的交集->最右下角的“ i”)

然后,ABAP使用https://help.sap.com/http.svc/rc/abapdocu_752_index_htm/7.52/en-US/abenconversion_type_c.htm#@@ITOC@@ABENCONVERSION_TYPE_C_1中给出的适当规则将C类型变量转换为I类型以进行比较:

Source Field Type c -> Numeric Target Fields -> Target  :
  "The source field must contain a number in mathematical or
  commercial notation. [...] Decimal places are rounded commercially
  to integer values. [...]"


解决方法,使23579235.43不会隐式舍入为23579235,因此比较将按预期进行:


要么IF +'23579235.43' = 23579235.(+使它成为表达式,即它对应于0 + '23579235.43',由于另一个名为“ calculation type”的规则,它变成带有小数的大打包类型)
IF conv decfloat16( '23579235.43' ) = 23579235.(浮点数16和34是带小数的大数字)

07-26 03:01