Проверка равенства ABAP неверна для INT4 и CHAR numeric

Я столкнулся с проблемой здесь, и я не могу точно понять, что делает 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 также возвращает «истина» для этого сравнения.

Проверка равенства ABAP неверна для INT4 и CHAR numeric

Что здесь происходит, и почему проверка не заканчивается сразу после того, как вы заметили, что эти два типа данных даже не совпадают? Это моя ошибка или эти классы assert просто неверны?

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

Проверка равенства ABAP неверна для INT4 и CHAR numeric

abap имеет ряд правил преобразования типов данных. Вы, вероятно, видите одно из них в действии, правило «послушайте, я знаю, что это строка, но я хочу, чтобы она рассматривалась как число, пожалуйста». В современном мире это абсолютно неприемлемо, но с точки зрения бизнес-программирования 80-х - очень удобная функция. help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/…

Dirk Trilsbeek 16.08.2018 13:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
1 692
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как сказал @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 преобразует переменную типа 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', который становится большим упакованным типом с десятичными знаками из-за другого правила под названием "тип расчета")
  • или IF conv decfloat16( '23579235.43' ) = 23579235. (десятичные числа 16 и 34 - большие числа с десятичными знаками)

Другие вопросы по теме