Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 算术溢出问题_C#_Asp.net_Sql Server 2005_Types - Fatal编程技术网

C# 算术溢出问题

C# 算术溢出问题,c#,asp.net,sql-server-2005,types,C#,Asp.net,Sql Server 2005,Types,我的数据库中有一个表作为freespace。。。它有一个名为freesize的列,其数据类型为int 我有三个价值: 1065189988 1073741818 1073741819 现在我试图获得总的可用空间,但我得到了一个错误 private void GetFreeSpace() { DataTable dt = new DataTable(); SqlConnection connection = new SqlConnection();

我的数据库中有一个表作为freespace。。。它有一个名为freesize的列,其数据类型为int

我有三个价值:

1065189988

1073741818

1073741819

现在我试图获得总的可用空间,但我得到了一个错误

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时出现算术溢出错误

关于如何在不更改数据类型的情况下在freespace中获取值,有什么建议吗

谢谢


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

乘以C<1,然后求和。

乘以C<1,然后求和。

所以你要对3个大整数求和,然后乘以一个小的双精度,但仍然希望输出是int

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


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

那么您将3个大整数求和,然后乘以一个小的double,但仍然希望输出为int

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


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

据我所知,你有两个选择:使用Li0liQ的方法,大约

SELECT SUM(freesize * 0.000000931322575) ...

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

< P>你可以有两个选择:据我所知:使用LiLiq的方法,按< /P>的顺序排序。
SELECT SUM(freesize * 0.000000931322575) ...

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

< P>单独的3个值的总和大于SQL中的一个int的数据类型大小,它被定义为范围: -2^31(-2147483648)至2^31-1(2147483647)

因此,您可以执行以下操作:

select cast(sum(cast(freesize as bigint))* 0.000000000931322575 as int) as freespace from freespace

这将支持数学运算并将结果作为INT返回,但此强制转换只会截断值并返回2,而作为双精度,它将是2.99,因此您还希望SQL对该数字进行适当的四舍五入。

仅3个值的总和就大于SQL中INT的数据类型大小,定义为范围: -2^31(-2147483648)至2^31-1(2147483647)

因此,您可以执行以下操作:

select cast(sum(cast(freesize as bigint))* 0.000000000931322575 as int) as freespace from freespace

这将支持数学运算,并将结果作为INT返回,但此强制转换只会截断值并返回2,而作为double,它将是2.99,因此您还需要SQL对该数字进行适当的四舍五入。

先乘法,然后求和

select cast(sum(freesize* 0.000000000931322575) as int)...
然而,正如亚当·格里特所指出的,你想要2或3作为你的答案:圆形还是截断?所以,扩展是答案。。。要在处理截断时正确舍入,请在转换回int之前添加0.5

select cast(sum(freesize* 0.000000000931322575) + 0.5 as int)...

先乘法,然后求和

select cast(sum(freesize* 0.000000000931322575) as int)...
然而,正如亚当·格里特所指出的,你想要2或3作为你的答案:圆形还是截断?所以,扩展是答案。。。要在处理截断时正确舍入,请在转换回int之前添加0.5

select cast(sum(freesize* 0.000000000931322575) + 0.5 as int)...

是的,一个接一个地得到它们很好。。。但是如果有三个以上的条目,则会使过程变慢…@Steven那么我应该用什么来代替呢?如果您试图计算GB大小,我会用1024^3来代替,并将结果存储在
System.Decimal
中。这样做更准确,也可能更有效。@unknown:原始答案建议使用bigint,这在数据库端可以很好地工作。在C#端,long是一个64位整数。或者,如果您处理的是大量数字,但不希望在表示十进制值时出现舍入错误,请使用decimal。是的,逐个获取它们是很好的。。。但是如果有三个以上的条目,则会使过程变慢…@Steven那么我应该用什么来代替呢?如果您试图计算GB大小,我会用1024^3来代替,并将结果存储在
System.Decimal
中。这样做更准确,也可能更有效。@unknown:原始答案建议使用bigint,这在数据库端可以很好地工作。在C#端,long是一个64位整数。或者,如果您处理的是大量数字,但不希望在表示十进制值时出现舍入错误,请使用decimal。