You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:20:38