0

次のようなコードがあります

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 を返しますが、どちらの式も正しいです。

提案してください。

4

2 に答える 2

0

'equlas' 演算子を使用して float 値を比較することは、計算の結果を float 表現に適合させる必要があるため、悪い考えです。比較を正しく行うには、許容範囲、つまり結果が意図した値からどれだけ逸脱できるかを指定する必要があります。「許容範囲」を追加するために、数式を少し書き直しました。

        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;
于 2015-06-22T08:07:17.477 に答える
0

他のフォーラムから正確な回答を得ました:-これは、浮動小数点数の格納方法の制限です。

float (System.Single) または double (System.Double) を使用する場合、数値はバイナリ形式を使用して格納されますが、すべての 10 進数値を正確に表すことはできません。同じように見える数値が、最下位桁の違いにより、同じとは見なされないことがよくあります。これは 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.479999999

正確な小数計算が必要な場合は、代わりに小数タイプ [^] を使用する必要があります。

于 2015-06-23T03:49:13.870 に答える