0

linq で列の値を計算しようとしています。合計は正しく行われますが、除算または乗算時に誤った値が生成されます。例を以下に示します。

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        DataTable dtWidgets = Get_widgets();   
        DataTable dtHits = Get_hits();

        var hit_rate =
        from w in dtWidgets.AsEnumerable()
        join h in dtHits.AsEnumerable()
            on w[0] equals h[0]
        select new
        {
            Date = w.Field<DateTime>("calendar_date"),
            Widgets = w.Field<int>("widgets"),
            Hits = h.Field<int>("hits"),
            TestSum = w.Field<int>("widgets")+h.Field<int>("hits"),
            TestMult = w.Field<int>("widgets") * h.Field<int>("hits")
        };

        gvWidgets.DataSource = dtWidgets;
        gvWidgets.DataBind();

        gvHits.DataSource = dtHits;
        gvHits.DataBind();

        gvLinq.DataSource = hit_rate.ToArray();
        gvLinq.DataBind();

    }

    static DataTable Get_widgets()
    {
        DataTable widgets = new DataTable();
        widgets.Columns.Add("calendar_date", typeof(DateTime));
        widgets.Columns.Add("widgets", typeof(int));

        widgets.Rows.Add("05/15/2012", 200000);
        widgets.Rows.Add("05/16/2012", 210000);
        return widgets;
    }

    static DataTable Get_hits()
    {
        DataTable hits = new DataTable();
        hits.Columns.Add("calendar_date", typeof(DateTime));
        hits.Columns.Add("hits", typeof(int));

        hits.Rows.Add("05/15/2012", 100000000);
        hits.Rows.Add("05/16/2012", 120000000);
        return hits;
    }
}

戻り値:

ウィジェットが TestSum にヒットした日付 TestMult

2012 年 5 月 15 日 12:00:00 午前 200000 100000000 100200000 -1662697472

2012 年 5 月 16 日 12:00:00 午前 210000 120000000 120210000 1426874368

4

2 に答える 2

1

コードの下にリストした数値の例を考えると、整数オーバーフローが発生しているようです。フィールド型を Int64 にしてみてください。

于 2012-05-25T22:43:26.867 に答える
0

もしあなたがどこにいたら、C# の int の制限を調べます... (2147483647)

long (= Int64) で試す

20000000000000 
>
2147483647
于 2012-05-25T22:43:47.760 に答える