6

Ncalc を使用して文字列を評価する一般的な計算ルーチンがあります。ただし、乗算の値が十分に小さいために Ncalc がそれらを int と見なすのに、結果が int には大きすぎるという問題に直面しています。

例:

        var expr = new NCalc.Expression("1740263 * 1234");
        object result = expr.Evaluate();
        Console.WriteLine(result.ToString());
        Console.ReadKey();

これにより、負の int 値が生成されます。

Ncalc が計算に long を使用するように強制する方法はありますか?

パラメータを使用してみましたが、これは機能しますが、コードを大幅に書き直して実装する必要があるため、可能であれば回避したいと考えています。

ありがとう

4

2 に答える 2

4

NCalc はInt32整数データ型として使用するため、数値を強制的に として計算することはできませんInt64。ただし、組み込みの数学関数を使用せず、単純な数学演算子に依存している場合は、数値を変換してlong正しい演算子を呼び出すことができます。見てみようよ:

var expr = new NCalc.Expression("CLng(1740263) * 1234");
expr.EvaluateFunction += delegate(string name, NCalc.FunctionArgs args)
{
    // Nostalgic CLng function...
    if (String.Equals(name, "CLng", StringComparison.CurrentCultureIgnoreCase))
    {
        args.HasResult = true;
        args.Result = Convert.ToInt64(args.EvaluateParameters()[0]);
    }
};

Int32ボックス化されたパラメーターをInt64直接キャストできないことに注意してConvert.ToInt64()ください(long)(int)args.EvaluateParameters()[0]。結果が正しいことを確認できます。

var result = expr.Evaluate();
Console.WriteLine("Result is: {0} (type {1})",
    result, result.GetType());

適切な型変換が実行されるので、両方の値をにキャストする必要はありませんlong

浮動小数点数 ( decimalNCalc 内) を直接使用することもでき、そのような問題は発生しないことに注意してください。

var expr = new NCalc.Expression("1740263.0 * 1234.0");
于 2016-03-30T08:35:35.900 に答える