我想使用 NCalc 或 DynamicExpresso 库在 C# 中计算一个字符串,问题是,当计算变得复杂并且数字很大时,它会返回错误的结果。例如,下面的代码在应该返回 3486784401 时返回 -808182895
string value = "387420489*9";
value = new Interpreter().Eval(value).ToString();
我做错什么了吗?谢谢您的帮助。
我想使用 NCalc 或 DynamicExpresso 库在 C# 中计算一个字符串,问题是,当计算变得复杂并且数字很大时,它会返回错误的结果。例如,下面的代码在应该返回 3486784401 时返回 -808182895
string value = "387420489*9";
value = new Interpreter().Eval(value).ToString();
我做错什么了吗?谢谢您的帮助。
尝试以下操作:
(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
问题是,我们需要什么
前者,我想。