-2

我正在使用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

4

2 回答 2

2

好的。我查看了源代码。这就是我发现的。

表达式的 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 添加到 double 中。

例如,您不能编译这一段(注意 m 代表十进制)。Math.Abs(-1m) + Math.Cos(2); 这实际上是 NCalc 在您输入时尝试做的事情

new Expression("Abs(-1) + Cos(2)").Evaluate()

我会称之为错误。您可以尝试编辑源并尝试解决此问题或找到其他选项。

于 2015-03-25T16:01:45.080 回答
0

在与 btevfik(乐于助人的家伙)简短交谈后,我们得出结论,这是 NCalc 中的一个错误。我想我必须分析源并修复它。

虽然我仍然接受答案...

于 2015-03-25T15:41:51.943 回答