NCalc Expression.Evaluate()提供错误的输出 [英] NCalc Expression.Evaluate() gives wrong output

查看:65
本文介绍了NCalc Expression.Evaluate()提供错误的输出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们有类似的代码



表达式e =新表达式([OD1000] = [OD1100] + [OD1200] + [OD1350] + [OD1450] );

//e.Parameters["OD1000"] = 15617031.48;

//e.Parameters["OD1100"] = 15226149.36;

//e.Parameters["OD1200"] = 166208.00;

//e.Parameters["OD1350"] = 0.00;

// e.Parameters [" OD1450"] = 224674.12;





e.Parameters [" OD1000"] = 9.33;

e.Parameters [" OD1100"] = 2.25;

e.Parameters [" OD1200"] = 3.25;

e.Parameters [ OD1350] = 1.5;

e.Parameters [" OD1450"] = 2.33;



object x = e.Evaluate ();



Console.WriteLine(" NCalc expression.evaluate(): - {0}",x.ToString());

Console.ReadLine();





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但两个表达式是正确的。



请建议。

We have code like

Expression e = new Expression("[OD1000]=[OD1100]+[OD1200]+[OD1350]+[OD1450]");
//e.Parameters["OD1000"] = 15617031.48;
//e.Parameters["OD1100"] = 15226149.36;
//e.Parameters["OD1200"] = 166208.00;
//e.Parameters["OD1350"] = 0.00;
//e.Parameters["OD1450"] = 224674.12;


e.Parameters["OD1000"] = 9.33;
e.Parameters["OD1100"] = 2.25;
e.Parameters["OD1200"] = 3.25;
e.Parameters["OD1350"] = 1.5;
e.Parameters["OD1450"] = 2.33;

object x = e.Evaluate();

Console.WriteLine("NCalc expression.evaluate() :- {0}", x.ToString());
Console.ReadLine();


1) 9.33 = 2.25 + 3.25 + 1.5 + 2.33

2) 15617031.48 = 15226149.36 + 166208.00 + 0.00 + 224674.12

After evaluate 1) will return true and 2) will return false though both expression are correct.

Please suggest.

推荐答案

这是对浮点数的限制存储。



当你使用 float System.Single )或 double System.Double ),数字以二进制格式存储,不能精确地表示每个小数值。您经常会发现出现相同的数字由于其最低有效数字的差异而被视为不相等。 MSDN上记录了这个 [ ^ ]。



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

This is a limitation of how floating-point numbers are stored.

When you use float (System.Single) or double (System.Double), the numbers are stored using a binary format, which cannot precisely represent every decimal value. You will often find that numbers which appear identical are not considered equal due to differences in their least significant digits. This is documented on MSDN[^].

If you take expression #2 and evaluate it in regular C# code, you'll see that it still returns false. If you print the result using the R format specified, you'll see why:
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





如果你需要精确的十进制计算,你应该使用 十进制类型 [ ^ ]而不是。


这篇关于NCalc Expression.Evaluate()提供错误的输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆