2013-06-06 12 views
6
私は誰かが私はLINQ内で使用Convert.ToDecimalは、小数点を四捨五入し、屋外で使用する場合されている理由を理解するに役立つかもしれない期待していた

、それは以下のDBを考えるとなぜConvert.ToDecimalが戻っている異なる値

はしていません。

CREATE TABLE [dbo].[Widgets](
    [ID] [int] NOT NULL, 
    [WidgetName] [varchar](50) NOT NULL, 
    [UnitsAvailable] [int] NOT NULL, 
    [WeightInGrams] [decimal](10, 6) NULL 
) ON [PRIMARY] 
GO 

INSERT [dbo].[Widgets] VALUES (1, N'Best thing ever', 100, CAST(10.000210 AS Decimal(10, 6))) 
INSERT [dbo].[Widgets] VALUES (2, N'Next Best thing', 50, CAST(100.000151 AS Decimal(10, 6))) 
INSERT [dbo].[Widgets] VALUES (3, N'The Other Model', 25, CAST(5.231651 AS Decimal(10, 6))) 

CODE:

class Program 
{ 
    static void Main(string[] args) 
    { 

     Console.WriteLine("------Example 1--------"); 

     LqToSqlDataContext _ctx = new LqToSqlDataContext(); 

     List<Widget> inventory = (from c in _ctx.linqWidgets 
            select new Widget() 
            { 
            Id = c.ID, 
            Name = c.WidgetName, 
            UnitsOnHand = c.UnitsAvailable, 
            WeightInGrams = Convert.ToDecimal(c.WeightInGrams) 
            }).ToList(); 

     foreach(Widget w in inventory) 
     { 
      Console.WriteLine(w.ToString()); 
     } 


     Console.WriteLine("------Example 2--------"); 

     var _linqInventory = _ctx.linqWidgets; 
     Widget temp = null; 

     foreach(linqWidget lw in _linqInventory) 
     { 
      temp = new Widget(); 
      temp.Id = lw.ID; 
      temp.Name = lw.WidgetName; 
      temp.UnitsOnHand = lw.UnitsAvailable; 
      temp.WeightInGrams = Convert.ToDecimal(lw.WeightInGrams); 

      Console.WriteLine(temp.ToString()); 
     } 



     Console.ReadLine(); 
    } 
} 

class Widget 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int UnitsOnHand { get; set; } 
    public decimal WeightInGrams { get; set; } 

    public override string ToString() 
    { 
     return this.Id + "\t" + this.Name + "\t" + this.UnitsOnHand + "\t" + this.WeightInGrams; 
    } 
} 

出力

------Example 1-------- 
1  Best thing ever 100  10.0002 
2  Next Best thing 50  100.0002 
3  The Other Model 25  5.2317 
------Example 2-------- 
1  Best thing ever 100  10.000210 
2  Next Best thing 50  100.000151 
3  The Other Model 25  5.231651 

答えて

3

LinqtoSqlはConvert.ToDecimalをCONVERT(DECIMAL({someNumberLinqComesupWith}、4)のようにSQL文に変換するため、

1

C#decimalタイプは、データベースのdecimalタイプと同じではないためです。

ご覧のとおり、C#decimalはより正確です。

関連する問題