繁体   English   中英

带ExecuteNonQuery()的SQL INSERT插入额外的小数位

[英]SQL INSERT with ExecuteNonQuery() inserts extra decimal places

我有一个用C#编写的asp.net应用程序。 我有一个插入按钮,该按钮用于获取页面上用户输入的信息,将值添加到列表中,并将列表发送到将数据插入到MSSQL数据库表中的方法。 除了在后端将数据类型设置为“ float”的字段外,其他所有操作均按预期进行。 如果在“温度”字段的文本框中输入诸如“ 70.3”之类的值,则插入的值实际上变为“ 70.3000030517578”。 我还有一个调用更新方法的按钮。 如果我将“ 70.3000030517578”更改回“ 70.3”并将其发送给更新方法,则数据库中正确插入了70.3。 这是我的SqlCommand参数代码:

cmd.Parameters.AddWithValue("@temp", listIn[0].Temperature == null ? (object)DBNull.Value : listIn[0].Temperature);

在上一行运行后,我在调试模式下检查了该参数,并确认该值是70.3。 看截图: temp_insert

我将此与更新进行了比较,因为该方法可以正常工作,并且属性变为: temp_update

两者的区别在于DbType和SqlDbType。 所以我尝试了下面的行,它什么都没有改变(仍然添加了额外的小数位):

cmd.Parameters.Add("@temp", SqlDbType.Float).Value = listIn[0].Temperature == null ? (object)DBNull.Value : listIn[0].Temperature;

如果我将后端的数据类型更改为十进制(18,3),则insert方法会正确插入'70 .300'。 我是使用小数数据类型而不是浮点数的唯一选择吗? 如果可能的话,我们宁愿使用float。 任何想法都欢迎。 我已经进行了很长时间,所以如果我的问题不够详细,我深表歉意。

阅读有关使用十进制,浮点和实数数据的信息

近似数字数据类型不能存储为许多数字指定的确切值; 它们存储的值非常接近 对于许多应用程序,在指定值和存储的近似值之间的微小差异并不明显。 但是,有时差异会变得明显。 由于float和real数据类型的近似性质,因此在需要精确的数字行为时(例如,在金融应用程序中,涉及舍入的操作中或在相等性检查中),请勿使用这些数据类型。 而是使用整数,十进制,货币或小货币数据类型。

您可能会遇到与浮点精度/错误有关的问题。 70.3不是一个可以用float / real类型精确表示的值。 可以存储的最接近的值(遵循IEEE-754标准)是70.30000305175781

http://www.h-schmidt.net/FloatConverter/IEEE754.html

如果您需要以10为底的精度,则十进制可能是正确的方法。 否则,您将必须自己四舍五入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM