首页 > 解决方案 > C# dt.Compute() 在某些乘法上不能正常工作

问题描述

再会,

我在 C# 中遇到了 dt.Compute() 的问题。

问题是当我试图计算类似的东西时: 500'000*5'000 比我得到:

System.OverflowException:“对于 'int32',值太大或太小。”

结果应该是:2'500'000'000 但 c# 得到这个结果:-2146233066,这对于 int32 来说太小了。

当我尝试计算 5*5 或 5'000'000'000 * 5'000'000 但是当我尝试计算类似 5'000'000'000'000 * 5'000'000' 000 我得到这个错误:

System.OverflowException:“对于 'int64',值太大或太小。”

但是当我计算更大的数字时它再次起作用,这意味着 dt.Compute() 在乘以一些数字时存在一些问题,但可以处理更大的数字或更小的数字。

希望有人可以帮助我解决这个问题。

这是我的代码:

string calculation = "500000*5000";
var anwser = dt.Compute(calculation, "");

string str_anwser = anwser.ToString();
RechnerOutput.Text = str_anwser;

标签: c#winformsdatatableint

解决方案


好吧,你不能,Int32 最大大小为2,147,483,648 ,而你的乘法结果是2,500,000,000,它更大,会导致你得到的异常

您可以做的一个简单技巧是强制您的一个参数为非 int32 数字

像这样

string calculation = "500000*5000.0";
var anwser = dt.Compute(calculation, "");

这将导致

2500000000.0

编辑:(正如@PaulF 所说)

dataSet 将尝试按升序(int32->int64->double)而不是结果本身将它们解析为文字。意思是如果其中一个文字是 int64 (在5000000000 * 5000000的情况下),那么结果可能会被解析为Int64,但在第一种情况下50000*500000两个文字都是Int32,因此结果将被视为

长版来自MSDN

整数文字 [+-]?[0-9]+ 被视为 System.Int32、System.Int64 或 System.Double。System.Double 可能会丢失精度,具体取决于数字的大小。例如,如果文字中的数字是 2147483650,DataSet 将首先尝试将该数字解析为 Int32。这不会成功,因为数量太大。在这种情况下,DataSet 会将数字解析为 Int64,这将成功。如果文字是一个大于 Int64 最大值的数字,DataSet 将使用 Double 解析文字。


推荐阅读