NCalc Expression.Evaluate()提供错误的输出 [英] NCalc Expression.Evaluate() gives wrong output
问题描述
我们有类似的代码
表达式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 usefloat
(System.Single
) ordouble
(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 theR
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屋!