为什么 SQL Server 将我的十进制参数 12.50 转换为 12.49999999

Why is SQL Server converting my decimal parameter 12.50 to 12.49999999

提问人:Cef 提问时间:12/3/2022 最后编辑:Cef 更新时间:12/4/2022 访问量:93

问:

我正在将十进制值从 C# 传递到 SQL Server 存储过程。

存储过程中的参数定义为 。在进入存储过程之前,该值为 25.631230@latitude decimal

运行探查器时,我可以看到 SQL Server 将值视为:25.631229999999999

当您处理经度/纬度时,这显然是一个截然不同的值。

SqlParameter lat = new SqlParameter { SqlDbType = System.Data.SqlDbType.Decimal, Value = 25.631230, ParameterName = "@latitude" };

cmd.Parameters.Add(lat);
cmd.CommandText = storedProcName;
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.ExecuteReader()

希望这只是一个;)的设置

存储过程 sql-server-2012 参数传递 十进制

评论

1赞 Dan Guzman 12/3/2022
什么是 C# 数据类型?将带有 SqlParameter 定义的 C# 代码添加到问题中。
0赞 marc_s 12/3/2022
您知道没有任何进一步的细节等同于小数点后没有数字的意思吗?decimaldecimal(18,0)
0赞 Cef 12/3/2022
添加了 c#。如果 decimal(18,0) 表示没有数字,为什么它仍然有数字?
0赞 Martin Smith 12/3/2022
System.Data.SqlDbType.Decimal将从值推断小数位数和精度,因此当您在 Profiler 中查看它时,您不会看到此截断。但是,当存储的 proc 使用该值时,如果参数数据类型不允许任何小数位数> 0,您仍会得到它。参数数据类型应类似于@latitude decimal (8,6)

答:

0赞 Cef 12/4/2022 #1

在存储过程“decimal(18, 15)”中添加精度是正确的解决方案。在我这样做之后,又弹出了另一个让我感到困惑的错误,但事实证明它与这个特定问题无关。

感谢所有为我指明正确方向的人。