我在C#中面临一个奇怪的问题,我需要评估一些数学字符串表达式,它可以除以AND date(created) between '2016-09-06' AND '2016-09-07'
。这是一个例子:
0
我目前正在使用NCalc库来评估此表达式,如果当前表达式中的string expression = GetUserInput(); // Example: "(x + y) / z", where z may equal to 0
参数为DivideByZeroException
,则会抛出z
。
我尝试通过执行以下操作来捕获异常:
0
但是,我需要以节省时间的方式评估此表达式超过6000次(使用不同的变量),因此每次捕获异常会显着减慢我的应用程序。
我有多个这样的表达式,每个表达式都是由用户输入的。我不知道给定的表达式是否试图除以零。
有没有办法以“安全”的方式评估C#中的数学表达式,其中尝试除以try {
string formula = GetUserInput();
Expression exp = new Expression(formula);
// ...
exp.Evaluate(); // Throws a DivideByZeroException
} catch (DivideByZeroException e) {
//ignored
}
将返回静态数字(0
或无穷大),而不会抛出异常?
答案 0 :(得分:3)
尝试使您的值浮点。
尝试将整数或十进制数除以零会抛出DivideByZeroException异常。要防止异常,请确保具有整数或十进制值的除法运算中的分母不为零。 将浮点值除以零并不会引发异常;根据IEEE 754算法的规则,它产生正无穷大,负无穷大或不是数字(NaN)。因为以下示例使用浮点除法而不是整数除法,所以该操作不会抛出DivideByZeroException异常。
https://msdn.microsoft.com/en-us/library/system.dividebyzeroexception.aspx
答案 1 :(得分:0)
评估z。如果z> 0然后执行操作,否则转到下一个评估。