在SQL Server中,我们可以写成 Numeric(15,10)
,那么在C#中等价于什么?
我知道 Numeric
的等价物是 Decimal
,但如何表示 Numeric(15,10)
?
在SQL Server中,我们可以写成 Numeric(15,10)
,那么在C#中等价于什么?
我知道 Numeric
的等价物是 Decimal
,但如何表示 Numeric(15,10)
?
numeric
/decimal
是十进制浮点类型,float
和real
是二进制浮点类型,因此您应该按照相同的方式进行匹配。 - Damien_The_Unbeliever有两个答案取决于两个问题:
1)什么东西允许您指定精度和比例。没有。这似乎是你的问题,但以防万一:
2)什么东西可以精确地指定十进制浮点数。这确实是十进制类型——但是点是内部的,并根据输入数字设置为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://learn.microsoft.com/en-us/ef/core/modeling/
Decimal
应该足够好了。 - V4Vendetta