Странное поведение CountIf() для шестнадцатеричных значений

Среда: Excel 2021 под Windows 11 Pro 64.

Мы знаем, что функция CountIf() в Excel имеет неприятное поведение: преобразует текст, похожий на число, в число перед подсчетом. Но теперь оказывается, что он даже неправильно выполняет эти преобразования для шестнадцатеричных значений.

Рассмотрим следующую таблицу:

Десятичная дробь Шестигранник Шестигранник 4 Десятичный счет Считать шестнадцатеричный Отсчитайте шестигранник 4 Примечание Руководство =DEC2HEX(A4) =DEC2HEX(A4, 4) =СЧЁТЕСЛИ(A:A, A4) =СЧЁТЕСЛИ(B:B, B4) =СЧЁТЕСЛИ(C:C, C4) Руководство 0 0 0000 1 1 3 1 1 0001 1 2 2 224 Е0 00E0 1 1 3 Обработка 0^0 как 0 225 Е1 00E1 1 1 3 0^1 = 0 481 1Е1 01E1 1 2 2 1^0 = 1 482 1Е2 01E2 1 2 2 1^2 = 1 483 1Е3 01E3 1 1 1 1^3 = 1 7680 1E00 1E00 1 2 2 1^0 = 1 7681 1E01 1E01 1 2 2 1^1 = 1 7682 1E02 1E02 1 2 2

Мы видим, что:

  • Правильно: 1 в столбце «Шестнадцатеричный счет» для 0 указывает, что все остальное в столбце «Шестнадцатеричный» не рассматривается как равное нулю, и это правильно.
  • Правильно: два 1 в столбце «Шестнадцатеричный счет» для E0 и E1 означают, что они не считаются эквивалентами чисел, и это правильно.
  • Правильно и спорно: три 3 в столбце «Отсчет шестнадцатеричных 4» указывают на то, что Excel рассматривает 0000, 00E0 и 00E1 как равные друг другу. Это верно для 0000 и 00E1, которые оба равны нулю. Это спорно для 00E0, что неоднозначно, но обычно принимается равным 1.
  • Неверно: 2 в каждом столбце «Посчитать шестнадцатеричный» и «Посчитать шестнадцатеричный 4» для 1 и 0001 указывают, что каждое из этих значений рассматривается как равное одному другому значению в своих столбцах, что неверно, поскольку в обоих есть много других значений. столбцы, равные 1.
  • Неправильно: 1 в каждом столбце «Посчитать шестнадцатеричный» и «Посчитать шестнадцатеричный 4» для 1E3 и 01E3 указывают, что каждое из этих значений рассматривается как НЕ равное любому другому значению в своих столбцах, что неверно, поскольку они оба равны 1 и, следовательно, равен многим другим значениям в обоих столбцах.
  • Неправильно: остальные десять 2 в таблице не имеют смысла, поскольку все они относятся к шестнадцатеричным значениям, равным 1. Они все должны быть 7.

Это еще одна ошибка в Excel или есть какое-то разумное объяснение такому поведению?

Может быть, это связано с тем, что Excel не может преобразовать значение в десятичное число, если оно не начинается с цифры?

Ron Rosenfeld 21.06.2024 16:09
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
1
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Здесь все работает так, как ожидалось. Путаница возникает из-за экспоненциальной записи: если x и y являются числами, xEy означает «x, умноженное на 10 в степени y», а не «x в степени y».

Например, 1E2 означает «1 раз 10^2» = 1 * 100 = 100, а 0E0 однозначно означает «0, умноженное на 10^0», что равно 0 (поскольку 10^0 четко определяется как 1).

Таким образом, неявное преобразование шестнадцатеричных значений в числа в Excel выглядит следующим образом:

  • Е0/Е1 – недействителен. (Они будут рассматриваться как текст COUNTIFS().)
  • 1E1, 1E2, 1E3 равны 10, 1000 и 1000 соответственно.
  • 1E00, 1E01 и 1E02 равны 1, 10 и 100 соответственно.
  • 00E0 и 00E1 равны 0 (соответственно 0 * 10^0 и 0 * 10^1).
  • 01E1, 01E2 и 01E3 идентичны 1E1, 1E2 и 1E3 (10, 100, 1000).
  • 1E00, 1E01 и 1E02 идентичны 1E0, 1E1 и 1E2 (1, 10, 100).

Чтобы увидеть неявные преобразования в Excel, попробуйте добавить два новых столбца, которые применяют операцию *1 к столбцам Hex и Hex 4. Вы увидите именно те числовые значения, в которые их преобразует Excel.

Применение формулы COUNTIFS() к преобразованным столбцам будет идентично результатам в вашей таблице, за исключением того, что E0 и E1 станут ошибками #VALUE! и поэтому будут считаться равными COUNTIFS().

ОЙ!!! Я глубоко смущен. Похоже, мне нужно вернуться и снова пройти школьную математику. Или это средняя школа? Интересно, что вопрос получил два голоса «за», хотя вместо этого, вероятно, следует проголосовать за его удаление. Раньше я думал, что глупого вопроса не существует, но теперь мне кажется, что я создал блестящий пример вопроса, который можно квалифицировать как действительно глупый. Как вы думаете, мне стоит удалить это?

NewSites 22.06.2024 18:36

Не вижу ничего плохого в том, чтобы оставить это (но ведь я явно предвзят, заслужив репутацию своим ответом!). Ваш вопрос подчеркивает поведение неявного преобразования COUNTIF(), которое неочевидно, и есть много пользователей Excel, которые на самом деле не понимают неявные преобразования Excel или экспоненциальную запись. Потенциальное столкновение между шестнадцатеричными строками и экспоненциальной записью также интересно/актуально. Мой голос «за» отразил качество вопроса (в том смысле, что он был достаточно ясен, и я смог воспроизвести результаты локально в течение пары минут). Кто-то другой явно согласился!

Neil T 22.06.2024 19:03

Ха-ха! Мне потребовался час или два, чтобы тщательно сформулировать вопрос, который делает его таким глупым. Во время всех этих размышлений мне должно было прийти в голову, что я неправильно использую обозначение E! В любом случае, я оставлю этот вопрос. Надеюсь, вы правы: кому-то моя глупость может оказаться полезной.

NewSites 22.06.2024 21:21

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

Как я могу распечатать или суммировать один шестнадцатеричный код большего размера в bash
Странное поведение в C, когда шестнадцатеричное значение (более 0x7f) присваивается (подписанному) символу
Оператор if не выполняется, когда к переменной применяется маска, хотя она должна
Преобразование шестнадцатеричного значения в изображение на C#
Самый эффективный способ преобразования значения шестнадцатеричной строки в Java с форматом
Можно ли разделить такую ​​шестнадцатеричную строку, используя только регулярное выражение?
Преобразование строки C# в шестнадцатеричное представление ее символов в кодировке UTF8
Как вручную преобразовать шестнадцатеричное представление fprintf с плавающей запятой в десятичное
Программа сборки меню долларовой стоимости (HLA)
Как разбить непрерывную шестнадцатеричную строку на шестнадцатеричные блоки, разделенные пробелами, по 32 кортежа в каждом?