2012-04-20 97 views
4
ads = ads.Where(x => (x.Amount - x.Price)/(x.Amount/100) >= filter.Persent); 

if x.Amount == 0我有錯誤「遇到零分錯誤」。如何防止零除?

像我這樣的請求是爲了避免?

更新:

這種幫助,但我不喜歡的決定:

ads = ads.Where(x => (x.Amount - x.Price)/((x.Amount/100)==0?0.1:(x.Amount/100)) >= filter.Persent); 

有另一種方式?

+0

什麼'Amount'的類型? – CodesInChaos 2012-04-20 09:18:25

+1

我想你應該想知道爲什麼你的項目有0金額:P – 2012-04-20 09:20:23

+1

什麼業務是'金額 - 價格'是一個有意義的數量? – 2012-04-20 09:36:16

回答

10
ads = ads.Where(x => x.Amount != 0 && 
        (x.Amount - x.Price)/(x.Amount/100) >= filter.Persent); 
+0

'x.Amount> 0'似乎只是一個更安全。 – 2012-04-20 09:37:15

+0

它肯定不會幫助 – Mediator 2012-04-20 09:55:09

+1

@simplydenis:什麼不會幫助? – Jon 2012-04-20 10:00:18

18

當然,你總是可以實現一個通用的安全劃分方法,並用它所有

using System; 

namespace Stackoverflow 
{ 
    static public class NumericExtensions 
    { 
     static public decimal SafeDivision(this decimal Numerator, decimal Denominator) 
     { 
      return (Denominator == 0) ? 0 : Numerator/Denominator; 
     } 
    } 

} 

我選擇小數類型的方式,因爲它解決了所有非可空數字類型,我意識到。

用法:

var Numerator = 100; 
var Denominator = 0; 

var SampleResult1 = NumericExtensions.SafeDivision(Numerator , Denominator); 

var SampleResult2 = Numerator.SafeDivision(Denominator); 
+0

+1的想法,但我如果分母爲零,不要認爲它應該歸零....實際值更接近+ -infinity,除非分子也是零,在這種情況下,它是未定義的。 – user420667 2013-10-10 19:45:52

+1

是的,user420667,我同意你的看法。雖然建議的解決方案可能不適合所有現實世界的情況,但我認爲它適合大多數人。但是,應該總是重視使用後備值的後果。無論如何,感謝您的想法:D – 2013-10-11 00:31:32

+0

我個人會將Numerator作爲因爲作爲程序員很多次,所以你可以搶bing從你想要分割的數據庫中計數。如果COUNT(N)= 8且COUNT(D)= 0,僅僅因爲D還沒有發生,返回值8更接近8/1,這是你最接近的實數。 – ScubaSteve 2015-01-23 18:28:23