Search code examples
c#.netncalc

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


I'm using NCalc to evaluate complex expressions. But I've found a major problem.

A simple formula like new Expression("Abs(-1) + Cos(2)").Evaluate() throws the exception

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

In C# code Math.Abs(-1) + Math.Cos(2) works, so either I'm doing something wrong or there is a bug in NCalc.

Does anyone have the same problem?

Does anyone have a solution?

The only thread i found on the project's website related to this error is quite old and talks about editing the source code. https://ncalc.codeplex.com/discussions/346702

I also posted a question on their forum but StackOverflow is usualy more dynamic. https://ncalc.codeplex.com/discussions/613634


Solution

  • Ok. I looked at the source code. And here is what I found.

    The Abs(-1) part of the expression is always evaluated as a decimal

    Result = Math.Abs(Convert.ToDecimal(
                            Evaluate(function.Expressions[0]))
                            );
    

    Cos(2) is evaluated as double

    Result = Math.Cos(Convert.ToDouble(Evaluate(function.Expressions[0])));
    

    And C# does not allow you to add these two types together.

    The reason that Math.Abs(-1) + Math.Cos(2) works is that Math.Abs(-1) actually evaluates as int. And you can perfectly add an int to double.

    You can not compile this piece for example (note m for decimal). Math.Abs(-1m) + Math.Cos(2); which is actually what NCalc is trying to do when you type out

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

    I would call this a bug. You can try to edit the source and try to fix this problem or find some other option.