我有一个用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。请参见屏幕截图:
两个区别在于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。欢迎任何想法。我没有这么久,所以如果我的问题不够详细,我道歉。
答案 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的精确度,小数可能是要走的路。否则,你必须自己进行四舍五入。