我使用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
答案 0 :(得分:1)
确定。我查看了源代码。这就是我发现的。
表达式的Abs(-1)部分始终被计算为小数
Result = Math.Abs(Convert.ToDecimal(
Evaluate(function.Expressions[0]))
);
Cos(2)被评估为double
Result = Math.Cos(Convert.ToDouble(Evaluate(function.Expressions[0])));
并且C#不允许您将这两种类型添加到一起。
Math.Abs(-1) + Math.Cos(2)
的作用原因是Math.Abs(-1)实际上计算为int。你可以完美地添加一个int来加倍。
你不能编译这个例子(注意m为十进制)。 Math.Abs(-1m) + Math.Cos(2);
这实际上是NCalc在你输入时试图做的事情
new Expression("Abs(-1) + Cos(2)").Evaluate()
我称之为错误。您可以尝试编辑源并尝试解决此问题或找到其他选项。
答案 1 :(得分:0)
在短暂的chat with btevfik(有帮助的家伙)之后,我们得出结论,这是NCalc中的一个错误。 我想我必须分析来源并修复它。
我仍然接受答案......