C# NCalc Expression.Evaluate()提供了错误的输出

C# NCalc Expression.Evaluate()提供了错误的输出,c#,ncalc,C#,Ncalc,我们有这样的代码 ncalcFormula = "[OD1000]=[OD1100]+[OD1200]+[OD1350]+[OD1450]" var expression = new Expression(ncalcFormula); foreach (FormulaParameter fp in parsedParameters) { expression.Parameters[fp.QuestionKey] = fp.Value; } object res =

我们有这样的代码

ncalcFormula = "[OD1000]=[OD1100]+[OD1200]+[OD1350]+[OD1450]"    
var expression = new Expression(ncalcFormula);  

foreach (FormulaParameter fp in parsedParameters)
{
    expression.Parameters[fp.QuestionKey] = fp.Value;
}    
object res = expression.Evaluate();
原始表达式:-[OD1000]=[OD1100]+[OD1200]+[OD1350]+[OD1450]

求值后调用解析表达式:-{([OD1000])=((([OD1100])+([OD1200])+([OD1350])+([OD1450]))

通过添加参数值进行测试,如下所示

1) 9.33=2.25+3.25+1.5+2.33

2) 15617031.48=15226149.36+166208.00+0.00+224674.12

求值后,1)将返回true,2)将返回false,尽管两个表达式都正确


请建议。

使用“Equals”运算符比较浮点值是个坏主意,因为计算结果必须拟合到浮点表示中。为了正确进行比较,您需要指定公差,即结果偏离预期值的程度。我改写了你的公式,增加了一些“容忍度”

        var ncalcFormula = "Abs([OD1000]-([OD1100]+[OD1200]+[OD1350]+[OD1450])) < 0.00001";    
        var expression = new Expression(ncalcFormula);  
        expression.Parameters["OD1000"] = 15617031.48;
        expression.Parameters["OD1100"] = 15226149.36;
        expression.Parameters["OD1200"] = 166208.00;
        expression.Parameters["OD1350"] =  0.00;
        expression.Parameters["OD1450"] = 224674.12;
var-ncalcFormula=“Abs([OD1000]-([OD1100]+[OD1200]+[OD1350]+[OD1450]))<0.00001”;
var表达式=新表达式(ncalcFormula);
表达式参数[“OD1000”]=15617031.48;
表达式参数[“OD1100”]=15226149.36;
表达式参数[“OD1200”]=166208.00;
表达式参数[“OD1350”]=0.00;
表达式参数[“OD1450”]=224674.12;

我从其他论坛得到了确切的答案:-这是对浮点数存储方式的限制

当您使用float(System.Single)或double(System.double)时,数字是使用二进制格式存储的,而二进制格式不能精确地表示每个十进制值。您经常会发现,由于最低有效数字的差异,看起来相同的数字被认为是不相等的。这记录在MSDN[^]上

如果使用表达式#2并在常规C代码中对其求值,您将看到它仍然返回false。如果使用指定的R格式打印结果,您将看到原因:

Console.WriteLine(15617031.48==15226149.36+166208.00+0.00+224674.12);//假的

Console.WriteLine(“{0:R}”,15617031.48);//15617031.48

Console.WriteLine(“{0:R}”,15226149.36+166208.00+0.00+224674.12);//15617031.47999999


如果您需要精确的十进制计算,您可能应该使用十进制类型[^]来代替。

成员4年。该是你学会如何在一个问题中格式化你自己的代码的时候了。在我看来,这就像是另一个“浮点数不起作用”的问题。