gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:12:45 26 4
gpt4 key购买 nike

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

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

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

然而, cl_abap_unit_assert=>assert_equals返回这两个值相同。我开始调试并注意到“EQ”语句用于检查值,并且在简单的 ABAP 中运行相同的语句也会返回“true”以进行比较。

analysis_Svc=>is_Equal

这里发生了什么,为什么在注意到两种数据类型甚至不相同后检查没有立即失败?这是我的错误,还是这些断言类不正确?
report ztest.
if ( '23579235.43' eq 23579235 ).
write: / 'This shouldn''t be shown'.
endif.

whydoesthiswork

最佳答案

正如@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. (decfloats 16 和 34 是带小数的大数)
  • 关于unit-testing - 对于 INT4 和 CHAR 数字,ABAP 相等性检查是错误的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51875875/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com