我正在使用NCalc来计算复杂表达式。但我发现了一个大问题。
像new Expression("Abs(-1) + Cos(2)").Evaluate()
这样的简单公式抛出异常
Operator '+' can't be applied to operands of types 'decimal' and 'double
在C#代码中,Math.Abs(-1) + Math.Cos(2)
是有效的,所以要么我做错了什么,要么NCalc中有一个错误。
有人有同样的问题吗?
有人有解决方案吗?
我在该项目的网站上发现的唯一一个与这个错误有关的帖子已经很旧了,并且谈到了编辑源代码。https://ncalc.codeplex.com/discussions/346702
我也在他们的论坛上发布了一个问题,但StackOverflow通常更具活力。https://ncalc.codeplex.com/discussions/613634
好的。我查看了源代码。以下是我的发现。
表达式的Abs(-1)部分总是作为十进制进行计算
Result = Math.Abs(Convert.ToDecimal(
Evaluate(function.Expressions[0]))
);
Cos(2)被评估为双重
Result = Math.Cos(Convert.ToDouble(Evaluate(function.Expressions[0])));
C#不允许您将这两种类型添加在一起。
Math.Abs(-1) + Math.Cos(2)
之所以有效,是因为Math.Abs(-1)的计算结果实际上是int。您可以完美地将int添加到double中。
例如,你不能编译这篇文章(注意m表示小数)。Math.Abs(-1m) + Math.Cos(2);
这实际上是NCalc在你输入时试图做的
new Expression("Abs(-1) + Cos(2)").Evaluate()
我会称之为bug。您可以尝试编辑源并尝试解决此问题,或者找到其他选项。
经过与btevfik(helpfull fella)的简短交谈,我们得出结论,这是NCalc中的一个错误。我想我必须分析来源并修复它。
我仍然接受答案。。。