Unit testing INT4和CHAR numeric的ABAP相等性检查错误

Unit testing INT4和CHAR numeric的ABAP相等性检查错误,unit-testing,abap,Unit Testing,Abap,我在这里遇到了一个问题,我不知道SAP到底在做什么。测试非常简单,我有两个完全不同类型的变量,以及两个完全不同的值 输入是一个值为23579235的INT4。我正在对字符串“23579235.43”测试相等函数。显然,我的期望是这两个变量是不同的,因为它们不仅不是同一类型的变量,而且它们的值也不相同。事实上,它们没有什么相似之处 EXPECTED1 23579235.43 C(11) \TYPE=%_T00006S00000000O0000000302 INDEX1 2357923

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

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

EXPECTED1 23579235.43   C(11)   \TYPE=%_T00006S00000000O0000000302
INDEX1    23579235      I(4)    \TYPE=INT4
但是,
cl\u abap\u unit\u assert=>assert\u equals
返回这两个值是相同的。我开始调试,注意到“EQ”语句用于检查值,在简单的ABAP中运行同一语句也会返回“true”进行比较

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

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

正如@dirk所说,如果比较或指定的变量/文本具有不同的类型,ABAP会隐式转换它们

首先,ABAP决定将C-type文本转换为类型I,以便将其与另一个I文本进行比较,而不是相反,因为在比较类型C和I时存在此优先级规则:

(c和i的交点->最右下方的“i”)

然后,ABAP使用以下给出的适当规则,将C-type变量转换为I-type进行比较:

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

  • IF+'23579235.43'=23579235.
    (由于另一个名为“”的规则,+使其成为一个表达式,即它对应于
    0+'23579235.43'
    ,它变成一个带小数的大压缩类型)
  • 如果conv decloat16('23579235.43')=23579235。
    (decloat16和34是带小数的大数字)

abap有许多数据类型转换规则。你可能会看到其中一个在起作用,“听着,我知道这是一个字符串,但我希望它被视为一个数字,请”规则。在当今世界绝对不行,但从80年代的角度来看,商业编程有一个非常方便的功能。
               | decfloat16, decfloat34 | f | p | int8 | i, s, b |
.--------------|------------------------|---|---|------|---------|
| string, c, n | decfloat34             | f | p | int8 | 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. [...]"