1

我在 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或无穷大),而不会引发异常?

4

2 回答 2

3

尝试使您的值浮点数。

尝试将整数或小数除以零会引发 DivideByZeroException 异常。为防止出现异常,请确保整数或小数除法运算中的分母不为零。将浮点值除以零不会引发异常;根据 IEEE 754 算术规则,它会导致正无穷大、负无穷大或非数字 (NaN)。由于以下示例使用浮点除法而不是整数除法,因此该操作不会引发 DivideByZeroException 异常。

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

于 2016-09-08T04:15:30.040 回答
0

评估 z。如果 z > 0 则执行操作,否则进行下一个评估。

于 2016-09-08T03:42:23.973 回答