2016-09-08 32 views
1

我在C#中面臨一個奇怪的問題,我需要評估一些數學字符串表達式,它可能會被0分隔。下面是一個例子:如何評估可以除以零的C#中的字符串表達式?

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,或無窮大),未拋出異常?

+0

你應該分析你的表達和檢查,如果z是零一有什麼不同? – Thomas

+0

你爲什麼認爲異常顯着減慢了你的應用程序? [它不應該影響太多](http://stackoverflow.com/questions/1308432/do-try-catch-blocks-hurt-performance-when-exceptions-are-not-thrown) –

+0

@Thomas每次,表達是不同的(因爲它是由用戶鍵入的),我不知道它是否可以被零除。 – Victor2748

回答

3

嘗試使您的值浮點。

嘗試將整數或十進制數除以零會引發DivideByZeroException異常。要防止出現異常,請確保分數運算中的整數或十進制值的分母不爲零。 將浮點值除以零不會引發異常;根據IEEE 754算法的規則,它會產生正無窮,負無窮,或者不是數(NaN)。由於以下示例使用浮點除法而不是整數除法,因此該操作不會引發DivideByZeroException異常。

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

0

評估z。如果z> 0,則執行該操作,否則轉到下一個評估。

+5

他不知道用什麼變量來進行鴻溝。它可以是任何將產生零除的組合。用戶可能會做x/y /(1-z) –

+3

@anil:在發佈這樣一個簡單的答案之前,您可能已經完成了討論。即使是一個新手C#編碼器也知道如何檢查0,像這樣評估z。如果z> 0,則執行該操作,否則轉到下一個評估 – ViVi

相關問題