SQL Server中的Numeric数据类型在C#中对应的是什么数据类型?

52

在SQL Server中,我们可以写成 Numeric(15,10),那么在C#中等价于什么?

我知道 Numeric 的等价物是 Decimal,但如何表示 Numeric(15,10)


2
好的,Decimal 应该足够好了。 - V4Vendetta
4个回答

77

据我所知,没有内置的.NET类型允许您明确指定精度/比例,因此不存在直接等效物。就像T-SQL中的NUMERIC一样,没有固定点类型。

decimaldouble是.NET常见的浮点类型,其中decimal实现了十进制浮点数(类似于T-SQL中的NUMERIC),而double实现了二进制浮点数行为(类似于T-SQL中的FLOAT和REAL)。 (还有一个较小的二进制浮点类型float。)

您应该根据要表示的值选择decimaldouble - 我通常认为“人造”的人工价值(特别是钱)适合使用decimal,而连续的自然值(例如物理尺寸)适合使用double


2
这些区别也适用于SQL服务器类型 - numeric/decimal是十进制浮点类型,floatreal是二进制浮点类型,因此您应该按照相同的方式进行匹配。 - Damien_The_Unbeliever

15

你可以查看这个网站,作为数据类型映射的指南。至于精度和长度,你可以使用格式说明符自行控制。


1

有两个答案取决于两个问题:

1)什么东西允许您指定精度和比例。没有。这似乎是你的问题,但以防万一:

2)什么东西可以精确地指定十进制浮点数。这确实是十进制类型——但是点是内部的,并根据输入数字设置为2 ^ 32个位置中的一个。不知道为什么,但只有28个值有效,或2 ^ 5-4..

因此,即使.Net允许Decimal看起来像浮点数,但在内部它非常不同,并且与SQLServer的Decimal匹配。任何不是2的不同幂次之和的东西都是使用正常二进制浮点数进行估计。这意味着即使是数字0.1,也已经失去了精度。但是Decimal类型不会。


0
如果您正在使用EntityFrameWorkCore,则有一个解决方案。 在项目中定义DbContext后,您可以按以下方式为模型添加配置:
public class ChequeEfConfiguration : IEntityTypeConfiguration<Cheque>
{
    public void Configure(EntityTypeBuilder<Cheque> builder)
    {
        builder.Property(a => a.Amount).HasColumnType("decimal(18,2)");                 
    }
}

或者您可以在您的DbContext中使用OnModelCreating,像这样:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
     base.OnModelCreating(modelBuilder);
     modelBuilder.Entity<Cheque>().Property(x => x.Amount)
          .IsRequired().HasColumnType("decimal(18,2)");
}

但我建议你使用第一个。 欲获取更多信息,请访问https://learn.microsoft.com/en-us/ef/core/modeling/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接