【发布时间】:2011-07-21 06:03:11
【问题描述】:
在 SQL Server 中,我们可以将数据写入为 Numeric(15,10) .. 在 C# 中相当于什么?
我知道Numeric 的等价物是Decimal 但是如何表示Numeric(15,10)?
【问题讨论】:
-
嗯
Decimal应该够好了
标签: c# sql-server-2005
在 SQL Server 中,我们可以将数据写入为 Numeric(15,10) .. 在 C# 中相当于什么?
我知道Numeric 的等价物是Decimal 但是如何表示Numeric(15,10)?
【问题讨论】:
Decimal 应该够好了
标签: c# sql-server-2005
没有直接的等价物,因为据我所知,没有内置的 .NET 类型允许您明确指定精度/比例。没有像 NUMERIC 这样的固定点类型。
decimal 和 double 是 .NET 中常见的浮点类型,decimal 实现 decimal floating point(如 T-SQL 中的 NUMERIC)和 double 实现 binary floating point 行为(如 FLOAT 和 REAL在 T-SQL 中)。 (还有float,它是一种较小的二进制浮点类型。)
您应该根据您要代表的价值在decimal 和double 之间进行选择——我通常认为“人造”、人为的价值(尤其是金钱)适合decimal,以及适合double 的连续自然值(例如物理尺寸)。
【讨论】:
numeric/decimal 是十进制浮点类型,float 和 real 是二进制浮点类型,所以你应该匹配 like for like .
尝试查看this site 作为数据类型映射的指南。至于精度和长度,您可以自己控制使用format specifiers
【讨论】:
根据两个问题有两个答案:
1) 什么是允许您指定精度和比例的东西。没有。这似乎是您的问题,但以防万一:
2) 什么东西可以让你精确地指定一个十进制浮点数。这确实是 Decimal 类型——但该点是内部的,并且根据输入数字设置为 2^32 个位置之一。不知道为什么,但只有 28 个值有效,或者 2^5 - 4..
因此,尽管 .Net 允许 Decimal 看起来像一个浮点数,但实际上它是非常不同的,并且与 SQLServer 的 Decimal 匹配。任何不是 2 个值的不同幂的总和都是使用正常二进制浮点的估计。这意味着即使是数字 0.1,也已经失去了精度。但不是 Decimal 类型。
【讨论】:
如果您使用的是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://docs.microsoft.com/en-us/ef/core/modeling/
【讨论】: