为什么Convert.ToDecimal返回不同的值

时间:2013-06-06 15:16:06

标签: c# .net linq-to-sql

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

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

2 个答案:

答案 0 :(得分:3)

因为LinqtoSql将Convert.ToDecimal转换为像CONVERT这样的sql语句(DECIMAL({someNumberLinqComesupWith},4)

答案 1 :(得分:1)

因为C#decimal类型与数据库中的decimal类型不同。

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