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

时间:2015-07-27 22:02:41

标签: c# sql-server

我有一个用C#编写的asp.net应用程序。我有一个插入按钮,用于在页面上获取用户输入的信息,将值添加到列表,并将列表发送到将数据插入MSSQL数据库表的方法。 除了数据类型设置为' float'的字段外,一切都按预期工作。在后端。 如果我输入的值为' 70.3'在字段'温度'的文本框中,插入的值实际上变为' 70.3000030517578'。我还有一个调用更新方法的按钮。如果我改变了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。欢迎任何想法。我没有这么久,所以如果我的问题不够详细,我道歉。

2 个答案:

答案 0 :(得分:3)

了解Using decimal, float, and real Data

  

近似数值数据类型不存储指定的确切值   很多数字;他们存储了非常接近的   值。对于很多应用来说,微小的区别   指定值和存储的近似值不明显。在   但是,时间差异变得明显。因为   浮点数和实数数据类型的近似性质,请勿使用这些   需要精确数字行为时的数据类型,例如   财务申请,涉及四舍五入的业务,或在   平等检查。而是使用整数,小数,金钱或   smallmoney数据类型。

答案 1 :(得分:1)

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

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

如果您需要基数10的精确度,小数可能是要走的路。否则,你必须自己进行四舍五入。