早安,
我在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;
答案 0 :(得分:5)
好吧,Int32的最大大小是 2,147,483,648 并且您的乘法结果是 2,500,000,000 ,该结果更大,将导致您得到异常
您可以做的一个简单技巧就是强制其中一个参数为非int32数字
像这样
string calculation = "500000*5000.0";
var anwser = dt.Compute(calculation, "");
这将导致
2500000000.0
编辑:(如@PaulF所说)
数据集将尝试以升序(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解析文字。