6

我希望有人可以帮助我理解为什么在 linq 中使用 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)))

代码:

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
4

2 回答 2

3

Because LinqtoSql translates Convert.ToDecimal to a sql statement like CONVERT(DECIMAL({someNumberLinqComesupWith}, 4)

于 2013-06-06T15:24:21.937 回答
1

因为 C#类型与 Database 中decimal的类型不一样。decimal

如您所见,C#decimal更准确。

于 2013-06-06T15:20:43.607 回答