在 C# 中计算字符串
Calculating a String in C#
我想使用 NCalc 或 DynamicExpresso 库在 C# 中计算一个字符串,问题是,当计算变得复杂且数字很大时,return 是错误的结果。
例如下面的代码 returns -808182895 当它应该 return 3486784401
string value = "387420489*9";
value = new Interpreter().Eval(value).ToString();
我做错了什么吗?
感谢您的帮助。
尝试以下操作:
(long)387420489 * (long)9
Dynamic Expresso 有一个网站 shell,您可以在此处测试表达式;
http://dynamic-expresso.azurewebsites.net/
在这个网站上测试时 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
问题是,我们需要的是什么
- 正确执行给定的算术表达式,正如我们和最终用户所期望的那样,
- 以 C# 方式执行给定的算术表达式?
我认为是前者。
我想使用 NCalc 或 DynamicExpresso 库在 C# 中计算一个字符串,问题是,当计算变得复杂且数字很大时,return 是错误的结果。 例如下面的代码 returns -808182895 当它应该 return 3486784401
string value = "387420489*9";
value = new Interpreter().Eval(value).ToString();
我做错了什么吗? 感谢您的帮助。
尝试以下操作:
(long)387420489 * (long)9
Dynamic Expresso 有一个网站 shell,您可以在此处测试表达式;
http://dynamic-expresso.azurewebsites.net/
在这个网站上测试时 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
问题是,我们需要的是什么
- 正确执行给定的算术表达式,正如我们和最终用户所期望的那样,
- 以 C# 方式执行给定的算术表达式?
我认为是前者。