【问题标题】:Operator '+' can't be applied to operands of types 'decimal' and 'double' - NCalc [closed]运算符“+”不能应用于“十进制”和“双精度”类型的操作数 - NCalc [关闭]
【发布时间】:2015-03-25 12:19:31
【问题描述】:

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

【问题讨论】:

  • 你一开始有没有试过搜索这个错误?
  • 您需要将它们转换为相同的类型。
  • @btevfik,你建议我怎么做?
  • 这个工作 new Expression("Abs(-1m) + Cos(2m)").Evaluate()
  • @btevfik 和大家。请不要只是抛出解决方案。如果您从未使用过并且不知道 NCalc,您将不会理解这个问题。 1º 我不能通过 -1m e 2m,因为它们不是有效数字。 2º 问题不在于 Abs 和 Cos 函数。它的总和。

标签: c# .net ncalc


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢。该项目虽然稳定可用,但似乎有点被遗弃了。我想唯一的选择是尝试解决这个问题
  • 看来问题已经解决了。它只是没有部署为版本ncalc.codeplex.com/SourceControl/changeset/5a719518101d
  • 我看到这个问题在最新的源中得到了解决,但没有部署到任何地方,所以我在github创建了一个克隆,链接到AppVeyor并发布到Nuget我也started一个新的project,打算将upgrade antlr 升级到版本4
【解决方案2】:

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

我仍然接受答案...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多