C# 算术溢出问题
我的数据库中有一个表作为freespace。。。它有一个名为freesize的列,其数据类型为int 我有三个价值: 1065189988 1073741818 1073741819 现在我试图获得总的可用空间,但我得到了一个错误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();
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。