2016-09-05 7 views
-1

ゼロは、私は非常に奇妙なこと見つけ理由:PerformanceSingleList変数は常に

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(); 

しかし、すべてのコミッションをゼロであってもTradePositionTodayはゼロではありません。さらに、私の小さなサンプルデータを使用すると、本当のビッグデータを使用するときにのみ問題が発生します。

[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

ブレークポイント(F9)を入れてデバッグします。 – Arshad

+0

あなたの不思議な「C」はゼロでしょうか? – ForNeVeR

+0

@ ForNeVeR 'const double C = 10/10000'は決して0ではありません – user6703592

答えて

4

残念ながら、const double C = 10/10000は確か0です。 10と10000の両方が整数である場合、除算が行われると、その結果はint型(共通型)として格納されてからdouble型のCに変換されます。場合

あなたがゼロではないとCを持っているしたい場合は、明示的に単に代わりにこの文を使用することにより、フロート/ double型として値のいずれかを伝える必要があります:

const double C = 10.0/10000; 

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

OK ....解決済み、ありがとう! – user6703592

+0

「10d/10000」と書くこともできると思います。数字の後にdまたはfを書くと、doubleまたはfloatとしてマークされます。 –

関連する問題