ABAP 相等性检查对 INT4 和 CHAR 数字是错误的

ABAP equality check is wrong for INT4 and CHAR numeric

我 运行 遇到了一个问题,我无法弄清楚 SAP 到底在做什么。测试非常简单,我有两个完全不同类型的变量,也有两个完全不同的值。

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

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

但是,cl_abap_unit_assert=>assert_equals returns 这两个值是相同的。我开始调试并注意到 'EQ' 语句用于检查值,运行 简单 ABAP 中的相同语句也用于此比较 returns 'true'。

这里发生了什么,为什么在注意到两种数据类型甚至不相同后检查没有立即失败?这是我的错误,还是这些 assert 类 不正确?

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

正如@dirk 所说,ABAP 隐式转换比较或赋值 variables/literals 如果它们具有不同的类型。

首先,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 将 C 类型变量转换为 I 类型以进行比较,使用 https://help.sap.com/http.svc/rc/abapdocu_752_index_htm/7.52/en-US/abenconversion_type_c.htm#@@ITOC@@ABENCONVERSION_TYPE_C_1 中给出的适当规则:

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.(decfloats 16和34是带小数的大数字)