为什么是Convert ?ToDecimal返回不同的值

本文关键字:返回 ToDecimal Convert 为什么 | 更新日期: 2023-09-27 18:17:10

我希望有人能帮助我理解为什么转换。ToDecimal在linq内部使用时是舍入小数,在linq外部使用时,它不

给定以下DB:

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

为什么是Convert ?ToDecimal返回不同的值

因为LinqtoSql翻译Convert。ToDecimal转换为sql语句,如CONVERT(DECIMAL({someNumberLinqComesupWith}, 4)

因为c#的decimal类型和数据库中的decimal类型不一样。

可以看到,c# decimal更准确。