首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NCalc Expression.Evaluate()输出错误

NCalc Expression.Evaluate()输出错误
EN

Stack Overflow用户
提问于 2015-06-22 07:38:57
回答 2查看 1.2K关注 0票数 0

我们有这样的代码

代码语言:javascript
运行
复制
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,尽管这两个表达式都是正确的。

请建议一下。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-22 08:07:17

使用“equlas”操作符来比较浮点值是个坏主意,因为计算结果必须用浮点数表示。为了正确地执行比较,您需要指定公差,即结果可能偏离预期值的程度。我重写了你的公式,以增加一些“宽容”。

代码语言:javascript
运行
复制
        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;
票数 0
EN

Stack Overflow用户

发布于 2015-06-23 03:49:13

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

当您使用浮点(System.Single)或双(System.Double)时,数字是使用二进制格式存储的,而二进制格式不能精确地表示每个十进制值。您经常会发现,由于其最小有效位数的差异,看起来相同的数字并不是相等的。这是在MSDN^上记录的。

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

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

Console.WriteLine({0:r},15617031.48);// 15617031.48

Console.WriteLine("{0:R}",15226149.36 + 166208.00 + 0.00 + 224674.12);// 15617031.479999999

如果需要精确的十进制计算,则可能应该使用小数类型^。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30974389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档