float,昨天晚上被你折磨死了

最近接了一个毕业设计的项目,到现在接近尾声了。很诡异的是,刚刚在做金额总额的时候,碰到了一个很奇怪的问题,我不知道各位童鞋有没有和我一样的经历,呵呵~~~我来分享一下吧。因因毕业设计是有关租房的,所以有一个字段是"zujin"(租金[我承认这个命名真的很恶心]),当我在models的时候,我是这样定义它的:

        /*月租金*/
        private float zujin;
        public void setZujin(float zujin) { this.zujin = zujin; }
        public float getZujin() { return this.zujin; }

这里的字段是 float,没有错。然后,我做金额总和的时候,去取它的值,如下:

protected float getZujinByHourseID(int housrID)
    {
        float zujin = 0;
        using (SqlConnection conn = new SqlConnection(str))
        {
            conn.Open();
            using (SqlCommand cmd = conn.CreateCommand())
            {
                string strSQL = "select zujin from hourse where hourseId=@hourseId ";
                cmd.CommandText = strSQL;
                cmd.Parameters.AddWithValue("hourseId", housrID);
                zujin = (float)(cmd.ExecuteScalar());
            }
        }
        return zujin;
    }

上面蓝色字体就是我们所关注的代码,因为在数据库中把"zujin"这个字段的类型设置为了float,所以我想在我取的时候,也应该是这个类型。

ExecuteSclalar()这个函数是从select中取出第一行的第一条数据,在本例中也就是租金。可是,但我运行的时候,发现“类型转换错误”,报错。

我刚开始,很纳闷。然后赶忙去检查数据库中的字段类型,然后又检查models里的类型,都没错啊!经过调试在调试之后,我就开始了最原始的办法,一个一个类型的进行转换。

最后,功夫不负有心人,找到了这个Convert.ToSingle 函数 转换成功。然后,我刚开始以为这会对精度有影响,但后来我确认后,对精度没有影响。还好。

自此,正确代码如下:

 protected float getZujinByHourseID(int housrID)
    {
        float zujin = 0;
        using (SqlConnection conn = new SqlConnection(str))
        {
            conn.Open();
            using (SqlCommand cmd = conn.CreateCommand())
            {
                string strSQL = "select zujin from hourse where hourseId=@hourseId ";
                cmd.CommandText = strSQL;
                cmd.Parameters.AddWithValue("hourseId", housrID);
                zujin = Convert.ToSingle(cmd.ExecuteScalar());
            }
        }
        return zujin;
    }

还有后面取的值,也是这样用的:

                while (dr.Read())
                {           
                    float LiveWater =Convert.ToSingle(dr.GetDouble((dr.GetOrdinal("LiveWater"))));
                    float Other = Convert.ToSingle(dr.GetDouble((dr.GetOrdinal("Other"))));
                    Response.Write("生活费d:" + LiveWater + "其他费用:" + Other);
                }

我这里还是觉得float,用的很不方便,一不小心 会把人给折磨怕的,就比如我吧,昨天晚上我足足的弄到了3点钟,牺牲了好多的睡眠,真实可惜。所以,我还是在建议在存储字段类型到时候,用double 比较安全吧。当然,只是个人建议。呵呵!

原文地址:https://www.cnblogs.com/damonlan/p/2011782.html