1

我想使用 NCalc 或 DynamicExpresso 库在 C# 中计算一个字符串,问题是,当计算变得复杂并且数字很大时,它会返回错误的结果。例如,下面的代码在应该返回 3486784401 时返回 -808182895

string value = "387420489*9";
value = new Interpreter().Eval(value).ToString();

我做错什么了吗?谢谢您的帮助。

4

1 回答 1

1

尝试以下操作:

(long)387420489 * (long)9

Dynamic Expresso 在这里有一个 Web shell,您可以在其中测试表达式;

http://dynamic-expresso.azurewebsites.net/

在这个 web shell 上进行测试时,我意识到了这一点;

 387420489L * 9 => Syntax error (at index 9). => does not accept type suffix
 (long)387420489 * 9 => -808182895 => overflow
 387420489 * (long)9 => 3486784401 => OK

 2147483647 + 1 => -2147483648 => int.MaxValue + 1 = int.MinValue (overflow)
 2147483648 + 1 => 2147483649 => When does not fit into Int32, interpreted as long

虽然其中大部分可以被视为设计(考虑到 Dynamic Expresso 如何评估语句),但仍有进一步的改进。

以 Javascript 为例。

387420489*9 => 3486784401

问题是,我们需要什么

  1. 正如我们和最终用户所期望的那样正确执行给定的算术表达式,
  2. 以 C# 方式执行给定的算术表达式?

前者,我想。

于 2020-04-07T12:43:56.073 回答