【问题标题】:C# dt.Compute() Don't work properly on some multiplicationsC# dt.Compute() 在某些乘法上不能正常工作
【发布时间】:2019-03-06 13:31:26
【问题描述】:

美好的一天,

我在 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;

【问题讨论】:

  • 通过读取documentation - 解析器根据表达式中的最大值猜测所需的数据大小(Int32/Int64)。当 Int64 太大时,将使用 Double。我猜所使用的数据类型是基于输入值而不是结果。

标签: c# winforms datatable int


【解决方案1】:

嗯,你不能,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 解析字面量。

【讨论】:

  • 虽然你的答案有效 - 它没有解决部分问题,这就是为什么你会得到一些大值(500000*5000)的溢出异常,但没有更大的值(5000000000 * 5000000 )。
猜你喜欢
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 2020-08-09
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
相关资源
最近更新 更多