Bry*_*ams 3 sap abap unit-testing
我在这里遇到了一个问题,我无法弄清楚SAP究竟在做什么.测试非常简单,我有两个完全不同的变量,并且有两个完全不同的值.
输入是值为23579235的INT4.我正在测试字符串'23579235.43'的相等函数.显然我的期望是这两个变量是不同的,因为它们不仅不是同一类型的变量,而且它们没有相同的值.实际上,关于它们的任何事情都不相似.
EXPECTED1 23579235.43 C(11) \TYPE=%_T00006S00000000O0000000302
INDEX1 23579235 I(4) \TYPE=INT4
Run Code Online (Sandbox Code Playgroud)
但是,cl_abap_unit_assert=>assert_equals返回这两个值是相同的.我开始调试并注意到'EQ'语句用于检查值,并且在简单的ABAP中运行相同的语句也会返回'true'进行此比较.
这里发生了什么,为什么在注意到两种数据类型甚至不相同之后检查不会立即失败?这是我的错误,还是这些断言类只是不正确?
report ztest.
if ( '23579235.43' eq 23579235 ).
write: / 'This shouldn''t be shown'.
endif.
Run Code Online (Sandbox Code Playgroud)
正如@dirk所说,如果ABAP具有不同的类型,它会隐式转换比较或指定的变量/文字.
首先,ABAP决定将C类文字转换为类型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 |
Run Code Online (Sandbox Code Playgroud)
("c"和"i" - >最右下角"i"的交叉点)
然后,ABAP使用https://help.sap.com/http.svc/rc/abapdocu_752_index_htm/7.52/en-US/abenconversion_type_c.htm中给出的适当规则将C类型变量转换为I类型以进行比较.#@@ 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. [...]"
Run Code Online (Sandbox Code Playgroud)
解决方法,以便23579235.43不会隐式舍入到23579235,因此比较将按预期工作:
IF +'23579235.43' = 23579235.(+使它成为一个表达式,即它对应于0 + '23579235.43'哪个成为带有小数的大包装类型,因为另一个名为" 计算类型 "的规则)IF conv decfloat16( '23579235.43' ) = 23579235.(decfloats 16和34是带小数的大数字)| 归档时间: |
|
| 查看次数: |
406 次 |
| 最近记录: |