2016-09-05 6 views
-1

ich eine sehr seltsame Sache gefunden:Warum die Variable immer Null

var PerformanceSingleList = TradePositionList//Compute the data for each stock everyday 
      .SelectMany((o, idx) => o.Select(p => 
      { 
       //default variable 
       double CloseYesterday = TradePositionList.ElementAt(0).Where(q => q.Stock.Symbol == p.Stock.Symbol).Select(q => (double)q.Stock.Close).First(); 
       int PositionYesterday = TradePositionList.ElementAt(0).Where(q => q.Stock.Symbol == p.Stock.Symbol).Select(q => q.Position).First(); 
       int TradePositionToday = 0; 
       if (idx != 0) //idx cann't be 0 otherwise, idx - 1 throw a error 
       { 
        PositionYesterday = TradePositionList.ElementAt(idx - 1).Where(q => q.Stock.Symbol == p.Stock.Symbol).Select(q => q.Position).First(); 
        CloseYesterday = TradePositionList.ElementAt(idx - 1).Where(q => q.Stock.Symbol == p.Stock.Symbol).Select(q => (double)q.Stock.Close).First(); 
        TradePositionToday = TradePositionList.ElementAt(idx - 1).Where(q => q.Stock.Symbol == p.Stock.Symbol).Select(q => q.RealDesignTradeShare).First();       
       } 

       double Commission = Math.Abs(TradePositionToday) * (double)p.Stock.Close * C; 


       return new 
       { 
        p.Stock, 
        p.Position, 
        p.RealDesignPosition, 
        p.RealDesignTradeShare, 
        TradePositionToday, 
        Commission, 
        PLN = ((double)p.Stock.Close - CloseYesterday) * PositionYesterday + TradePositionToday * (double)p.Stock.Close - Math.Abs(TradePositionToday) * (double)p.Stock.Close * SA, 
        NAV = (double)p.Stock.Close * p.Position - Math.Abs(p.Position) * (double)p.Stock.Close * SA - Commission 
       }; 
      } 
       ).ToList() 
      ).ToList(); 

Aber alle Commision in PerformanceSingleList Null sind sogar TradePositionToday nicht Null ist. Außerdem gibt es kein Problem, wenn ich meine kleinen Beispieldaten verwende, nur wenn ich echte Big Data verwende.

[61] { Stock = {{ Symbol = 1088 HK, Close = 12.860000000, Date = 3/7/2016 12:00:00 AM, Vol = 0.0490939300240106 }}, Position = -562, RealDesignPosition = 67, RealDesignTradeShare = 629, TradePositionToday = -562, Commission = 0, PLN = -7227.32, NAV = -7227.32 } <Anonymous Type> 
    Commission 0 double 
    NAV -7227.32 double 
    PLN -7227.32 double 
    Position -562 int 
    RealDesignPosition 67 int 
    RealDesignTradeShare 629 int 
    Stock { Symbol = "1088 HK", Close = 12.860000000, Date = {3/7/2016 12:00:00 AM}, Vol = 0.049093930024010565 } <Anonymous Type> 
    TradePositionToday -562 int 
+2

Setzen Sie einen Haltepunkt (F9) und debuggen Sie ihn. – Arshad

+0

Vielleicht ist dein mysteriöses 'C' dann null? – ForNeVeR

+0

@ ForNeVeR 'const doppelt C = 10/10000' nie sein 0 – user6703592

Antwort

4

Leider ist const double C = 10/10000 tatsächlich 0. 10 und 10000 sind beide Ganzzahlen. Wenn die Division abgeschlossen ist, wird das Ergebnis als int (gemeinsamer Typ) gespeichert, bevor es in C als Double konvertiert wird.

Im Fall, wenn Sie die C haben mögen nicht Null zu sein, müssen Sie einen des Wertes als float/double-Typ explizit sagen, indem man einfach diese Aussage statt mit:

const double C = 10.0/10000; 

oder

const double C = ((double)10)/10000; 
+0

Ok .... gelöst, danke! – user6703592

+0

Ich glaube, du kannst auch "10d/10000" schreiben. Wenn Sie d oder f nach Zahlen schreiben, markieren Sie sie als Double oder Float. –