Почему 0 делится на 0, бросая ошибку переполнения в VBA?

Почему 0/0 бросает Overflow error в VBA, а на .Net-языках это просто ошибка Division by 0?


Например, в C# это значение System.DivideByZeroException

static void Main()
{
    int k = 0;
    int p = 0;
    Console.WriteLine(k/p);
}

Div/0 ошибка существует в VBA. Но 0/0 предоставляет исключение переполнения, а все, что делится на 0, дает исключение Div/0:

Public Sub TestMe()

    'Integer
    PrintAndCheck (11)      '- Division by zero error

    'Double
    PrintAndCheck (0.9)     '- Division by zero error

    'Long
    PrintAndCheck (50000)   '- Division by zero error

    'String
    PrintAndCheck ("1.1")   '- Division by zero error

    '----------------------------------------------------
    '----------------BUT---------------------------------
    '----------------------------------------------------

    'Integer
    PrintAndCheck (0)       '- Overflow?

End Sub

Public Sub PrintAndCheck(lngDivisor As Variant)

    On Error Resume Next

    Debug.Print lngDivisor / 0
    Debug.Print Err.Description & " from type -> " & VarType(lngDivisor)

    On Error GoTo 0

End Sub

Что вы получите в ближайшем окне:

Division by zero from type -> 2
Division by zero from type -> 5
Division by zero from type -> 3
Division by zero from type -> 8
Overflow from type -> 2

Изменить: Чтобы сделать интересную историю интересной:

Public Sub TestMe()
    On Error Resume Next
    Debug.Print Evaluate("0/0")     'Division by 0 error (CVErr(xlErrDiv0)=2007)
    Debug.Print 0 \ 0               'Division by 0 error
    Debug.Print Err.Description
    On Error GoTo 0
End Sub

Ответ 1

https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/floating-point-division-operator

Помимо очевидных различий в реализации языков и способа VBA обрабатывает division, ссылка MS Doc выше расширяет причины overflow exception, что если типы данных операндов являются целыми, тогда он будет бросать overflow exception (Последнее утверждение ниже)

введите описание изображения здесь

В качестве альтернативы существует \ оператор разделения, который проверяет диапазон для вас и выдает исключение Division by zero

Ответ 2

Попробуем обобщить ответы из комментариев так, как я их понимаю. Не стесняйтесь редактировать этот ответ или добавить свой собственный ответ.

  • В VBA 0/0 выдается исключение переполнения, потому что 0/0 - это конкретный случай деления на 0. Таким образом, рекомендуется создать другое исключение, кроме стандартного Division by zero error.

  • В VBA Evaluate("0/0") возвращается Division by zero error, потому что Evaluate не вызывает ошибку, он возвращает значение Variant с флагом ошибки, и флаг "переполнения" отсутствует.

  • В VBA целочисленном делении 0\0 возвращает a Division by zero error, потому что результат должен быть целым, а #IND - значением с плавающей запятой. Поскольку #IND не может быть возвращено, он дает следующую лучшую вещь - Division by zero error.

Дополнительная информация о 0/0 на других языках: