运算符“+”不能应用于 'decimal' 和 'double' 类型的操作数 - NCalc

Operator '+' can't be applied to operands of types 'decimal' and 'double' - NCalc

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

我还在他们的论坛上发布了一个问题,但 Whosebug 通常更动态。 https://ncalc.codeplex.com/discussions/613634

经过简短的 chat with btevfik(有帮助的家伙)我们得出结论,这是 NCalc 中的一个错误。 我想我将不得不分析源代码并修复它。

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

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

表达式的 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()

我认为这是一个错误。您可以尝试编辑源代码并尝试解决此问题或找到其他选项。