Как оценить строковое выражение в 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, тогда выполните операцию, иначе перейдите к следующей оценке.