Как оценить строковое выражение в C#, которое можно разделить на ноль?

Я сталкиваюсь со странной проблемой в C#, где мне нужно оценить некоторые математические строковые выражения, которые могут быть разделены на 0, Вот пример:

string expression = GetUserInput(); // Example: "(x + y) / z", where z may equal to 0

В настоящее время я использую библиотеку NCalc для оценки этого выражения, которое выдает DivideByZeroException если z Аргумент в текущем выражении 0,

Я попытался поймать исключение, выполнив:

try {
    string formula = GetUserInput();
    Expression exp = new Expression(formula);

    // ...

    exp.Evaluate(); // Throws a DivideByZeroException

} catch (DivideByZeroException e) {
    //ignored
}

Однако мне нужно оценивать это выражение более 6000 раз (с разными переменными) эффективным образом, поэтому перехват исключения каждый раз значительно замедляет мое приложение.

У меня есть несколько таких выражений, каждое из которых вводится пользователем. Я не могу знать, пытается ли данное выражение делить на ноль или нет.

Есть ли способ оценить математическое выражение в C# "безопасным" способом, где попытка делить на 0 вернет статический номер (0или бесконечность), не бросая исключения?

2 ответа

Решение

Попробуйте сделать ваши значения с плавающей точкой.

Попытка разделить целое или десятичное число на ноль вызывает исключение DivideByZeroException. Чтобы предотвратить исключение, убедитесь, что знаменатель в операции деления с целыми или десятичными значениями не равен нулю. Разделение значения с плавающей точкой на ноль не вызывает исключения; это приводит к положительной бесконечности, отрицательной бесконечности или не числу (NaN), в соответствии с правилами IEEE 754. Поскольку в следующем примере используется деление с плавающей точкой, а не целочисленное деление, операция не вызывает исключение DivideByZeroException.

https://msdn.microsoft.com/en-us/library/system.dividebyzeroexception.aspx

Оценить з. Если z> 0, тогда выполните операцию, иначе перейдите к следующей оценке.

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