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

x.Amount == 0の場合「ゼロで除算エラーが発生しました」というエラーが表示されます。ゼロ除算を防ぐには?

このリクエストで私のようなことは避けたいですか?

更新:

これは助けたが、私は決断を好きではない:

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

別の方法がありますか?それは私がすべての非NULL値可能の数値型を扱うので、もちろん

+0

Amount' 'の種類は何ですか? – CodesInChaos

+1

私はあなたがなぜ0金額の商品を持っているのだろうと思うと思うと思います:P –

+1

「金額 - 価格」は何の意味ですか? –

答えて

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

'x.Amount> 0'はほんの少し安全なようです。 –

+0

それは確かに助けてくれません – Mediator

+1

@simplydenis:何が助けにならないでしょうか? – Jon

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は考えていますが、私は分母がゼロの場合にはゼロを返さなければならないとは思わない...分子がゼロでない限り、実際の値は+極小に近い。 – user420667

+1

はい、user420667、私はあなたに同意する。それにもかかわらず、いずれにしても、フォールバックの値を使用した場合の影響を常に考慮する必要があります。D –

+0

私は個人的にNumeratorを次のように返します。プログラマーとして何度もフォールバックの価値があるので、あなたはあなたが分割したいDBからのビングカウント。 COUNT(N)= 8とCOUNT(D)= 0の場合、Dがまだ発生していないため、値8を返すのは最も近い実数である8/1に近い値になります。 – ScubaSteve