ASP.Net Core API中Decimal存入数据库意外保留2位问题求助
问题原因及解决办法
可能原因
- EF Core 模型精度未显式配置:EF Core对decimal类型默认使用(18,2)的精度配置,即便数据库列是(18,3),映射时仍会自动将值截断/舍入到2位小数。
- 存储过程参数映射不完整:调用存储过程时,未显式指定参数的精度和小数位,导致ADO.NET/EF Core使用默认的(18,2)精度处理数值,丢失第三位小数。
- JSON序列化精度丢失:ASP.NET Core默认的System.Text.Json序列化器处理decimal时,可能存在精度截断问题,将传入的3位小数反序列化为2位。
- 数据库后台逻辑修改:数据库中该列可能存在触发器、计算约束或默认值规则,自动修改了存入的数值。
解决办法
显式配置EF Core模型精度
方式一:使用Fluent API在DbContext的OnModelCreating中配置:modelBuilder.Entity<YourEntityName>() .Property(e => e.GrossWeight) .HasPrecision(18, 3);方式二:使用数据注解直接标记属性:
[Column(TypeName = "decimal(18, 3)")] public decimal? GrossWeight { get; set; }确保存储过程参数精度正确
若用ADO.NET调用存储过程,需显式设置参数的精度和小数位:var grossWeightParam = new SqlParameter("@GrossWeight", SqlDbType.Decimal) { Value = yourModel.GrossWeight, Precision = 18, Scale = 3 };若用EF Core调用存储过程,确保模型已配置好精度,直接传递模型属性即可。
调整JSON序列化配置
使用System.Text.Json时,修改配置保留decimal精度:builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.NumberHandling = System.Text.Json.Serialization.JsonNumberHandling.AllowReadingFromString | System.Text.Json.Serialization.JsonNumberHandling.WriteAsString; });若使用Newtonsoft.Json,配置如下:
builder.Services.AddControllers() .AddNewtonsoftJson(options => { options.SerializerSettings.FloatParseHandling = Newtonsoft.Json.FloatParseHandling.Decimal; });排查数据库后台逻辑
检查数据库中该表的触发器、约束、计算列规则,确认是否存在自动修改GrossWeight值的逻辑。
内容的提问来源于stack exchange,提问作者Nitesh
相关产品推荐
相关产品推荐

