C#传递Decimal参数至SQL Server存储过程时精度异常问题排查
解决C#向SQL Server存储过程传递Decimal精度丢失问题
问题根源
- C#字面量类型问题:代码中
Value = 25.631230是double类型(二进制浮点数),这类数无法精确表示部分十进制小数,25.631230转成double后实际是25.631229999999999,传递到SQL Server时就会保留这个不精确值。 - SQL Server参数定义不明确:存储过程中
@latitude decimal未指定精度和小数位数,默认是decimal(18,0),虽然不会截断小数,但无法修正传递过来的精度误差。
解决方案
- 修改存储过程参数定义:根据经纬度的精度需求,显式指定小数位数(比如保留6位小数,对应米级精度):
@latitude decimal(10,6) - C#中使用decimal类型赋值:给小数字面量加上
M后缀,让它成为C#的decimal类型(十进制浮点数,无精度损失):SqlParameter lat = new SqlParameter { SqlDbType = System.Data.SqlDbType.Decimal, Value = 25.631230M, ParameterName = "@latitude" }; - 可选:显式设置SqlParameter的精度:为了和SQL Server参数保持一致,可额外指定Precision和Scale:
SqlParameter lat = new SqlParameter { SqlDbType = System.Data.SqlDbType.Decimal, Value = 25.631230M, ParameterName = "@latitude", Precision = 10, Scale = 6 };
内容的提问来源于stack exchange,提问作者Cef
相关产品推荐
相关产品推荐

