首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >算术溢出问题

算术溢出问题
EN

Stack Overflow用户
提问于 2010-01-04 19:35:47
回答 5查看 3.5K关注 0票数 1

我的数据库里有一张自由空间的桌子..。它有一个名为freesize的列,其数据类型为int。

我有三种价值:

1065189988

1073741818

1073741819

现在,我试图得到总空闲空间,但我得到了一个错误。

代码语言:javascript
复制
private void GetFreeSpace()
    {
        DataTable dt = new DataTable();
        SqlConnection connection = new SqlConnection();
        connection.ConnectionString = ConfigurationManager.ConnectionStrings["SumooHAgentDBConnectionString"].ConnectionString;
        connection.Open();
        SqlCommand sqlCmd = new SqlCommand("select sum(freesize)* 0.000000000931322575 as freespace from freespace", connection);
        SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCmd);
        sqlDa.Fill(dt);
        connection.Close();
        if (dt.Rows.Count > 0)
        {
          double  freeSpace = Convert.ToDouble(dt.Rows[0]["freespace"].ToString());
        }
    }

将表达式转换为数据类型int的

算术溢出错误。

代码语言:javascript
复制
Line 123:            SqlCommand sqlCmd = new SqlCommand("select sum(freesize)* 0.000000000931322575 as freespace from freespace", connection);
Line 124:            SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCmd);
Line 125:            **sqlDa.Fill(dt);** here i get error
Line 126:            connection.Close();
Line 127:            if (dt.Rows.Count > 0)

对于如何在不改变数据类型的情况下获得自由空间中的值,有什么建议吗?

谢谢

我知道它对bigint很有效,但我想要int。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-01-04 19:40:54

所以你要把3个大整数相加,然后乘以一个很小的两倍,但仍然希望输出是一个int?

您可以将每一行检索为int,然后在c#中进行计算。

或者,您可以在求和之前将整数转换为bigint或double,这样就不会在那里溢出。

票数 3
EN

Stack Overflow用户

发布于 2010-01-04 19:49:14

据我所知,您有两个选择:使用Li0liQ的方法,按

代码语言:javascript
复制
SELECT SUM(freesize * 0.000000931322575) ...

这可能是因为准确性的问题,或者,吸吮它和使用bigint。这就提出了一个问题:为什么你这么关心使用int而不是bigint?如果你只有一把锤子,那就疯狂吧。但如果没有令人信服的理由不使用bigint,我至少会考虑使用bigint。

票数 1
EN

Stack Overflow用户

发布于 2010-01-04 19:49:40

仅3个值的总和就大于SQL中Int的数据类型大小,后者定义为-2^31 (-2,147,483,648)到2^31-1 (2,147,483,647)

因此,您可以这样做:

代码语言:javascript
复制
select cast(sum(cast(freesize as bigint))* 0.000000000931322575 as int) as freespace from freespace

它将支持数学,并将结果作为INT返回,但是这个强制转换只会截断值并返回2,而作为双值,它将是2.99,所以您也希望SQL适当地舍入这个数字。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2001631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档