2012-04-20 1 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

+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; 
     } 
    } 

} 

Я избрал десятичную типа, поскольку он затрагивает все не NULLABLE числовых типов, которые, я осознавая.

Использование:

var Numerator = 100; 
var Denominator = 0; 

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

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

+1 за эту мысль, но я не думайте, что он должен возвращать ноль, если знаменатель равен нулю .... фактическое значение ближе к + -infinity, если числитель также не равен нулю, и в этом случае он не определен. – user420667

+1

Да, user420667, я согласен с вами. Хотя предлагаемое решение может не соответствовать всем реальным ситуациям, я думаю, что он подходит для большинства из них. Тем не менее, всегда нужно взвешивать последствия использования запасного значения. В любом случае, спасибо за вашу мысль: D –

+0

Я лично верну Numerator как резервное значение, потому что много раз как программист, вы захватываете bing подсчитывает из базы данных, которую вы хотите разделить. Если COUNT (N) = 8 и COUNT (D) = 0, то только потому, что D еще не произошло, возвращение значения 8 ближе к 8/1, что является вашим самым близким реальным числом. – ScubaSteve

 Смежные вопросы

  • Нет связанных вопросов^_^