5

double x = 3 / 2; を強制する方法 D サフィックスまたはキャストなしで x で 1.5 を返すには? 実行できる演算子のオーバーロードはありますか? またはいくつかのコンパイラオプション?

驚くべきことに、次の理由により、キャストやサフィックスを追加するのはそれほど簡単ではありません。

ビジネス ユーザーは、独自の数式を作成してデバッグする必要があります。現在、C# は、これらのユーザーがコンピューター サイエンス エンジニアではないという点で、DSL (ドメイン固有言語) のように使用されています。したがって、彼らが知っているのは、通常は単なる数式である「ビジネス ルール」を保持するために、いくつかのタイプのクラスを編集および作成する方法だけです。

しかし、彼らは常に double x = 3 / 2 を想定しています。x = 1.5 を返しますが、C# では 1 を返します。

A. 彼らはいつもこれを忘れ、デバッグに時間を浪費し、私に電話してサポートを求めると、私たちはそれを修正します。B. 彼らはそれが非常に見苦しく、ビジネスルールの可読性を損なっていると考えています。

ご存じのとおり、DSL は自然言語に近いものにする必要があります。

はい。Boo に移行してそれに基づく DSL を構築する予定ですが、それはまだ先の話です。

double x = 3 / 2; を作成する簡単な解決策はありますか? クラスの外部で 1.5 を返すので、ユーザーには見えませんか?

ありがとう!ウェイン

4

9 に答える 9

5

3 / 2いいえ、 1.5 を返すソリューションはありません。

制約を考慮した唯一の回避策は、ユーザーが数式でリテラルを使用しないようにすることです。定数の使用を奨励してください。または、本当にリテラルを使用する必要がある場合は、小数点付きのリテラルを使用するように勧めます。

于 2010-03-21T04:18:44.133 に答える
1

決して言わないでください...(double)3/2ソリューションはよさそうです...

しかし、4+5/6では失敗しました

これを試してみてください:SymbolicComputation.comが自由に使用できるようにパブリックドメインに寄付されました。
アルファ版ですが、試してみることができます。いくつかのテストで実行しただけです。私のサイトとソフトウェアはすぐに起動するはずです。これはMicrosoftのRoslynを使用しており、すべてがうまくいけば、すべての数字の後に「d」を付けます。Roslynもアルファ版ですが、かなりの量のC#を解析します。

    public static String AddDSuffixesToEquation(String inEquation)
    {
        SyntaxNode syntaxNode = EquationToSyntaxNode(inEquation);
        List<SyntaxNode> branches = syntaxNode.DescendentNodesAndSelf().ToList();
        List<Int32> numericBranchIndexes = new List<int>();
        List<SyntaxNode> replacements = new List<SyntaxNode>();
        SyntaxNode replacement;
        String lStr;
        Int32 L;
        for (L = 0; L < branches.Count; L++)
        {
            if (branches[L].Kind == SyntaxKind.NumericLiteralExpression)
            {
                numericBranchIndexes.Add(L);
                lStr = branches[L].ToString() + "d";
                replacement = EquationToSyntaxNode(lStr);
                replacements.Add(replacement);
            }
        }

        replacement = EquationToSyntaxNode(inEquation);
        List<SyntaxNode> replaceMeBranches;
        for (L = numericBranchIndexes.Count - 1; L >= 0; L--)
        {
            replaceMeBranches = replacement.DescendentNodesAndSelf().ToList();
            replacement = replacement.ReplaceNode(replaceMeBranches[numericBranchIndexes[L]],replacements[L]);
        }
        return replacement.ToString();

    }

    public static SyntaxNode EquationToSyntaxNode(String inEquation)
    {
        SyntaxTree tree = EquationToSyntaxTree(inEquation);
        return EquationSyntaxTreeToEquationSyntaxNode(tree);
    }

    public static SyntaxTree EquationToSyntaxTree(String inEquation)
    {
        return SyntaxTree.ParseCompilationUnit("using System; class Calc { public static object Eval() { return " + inEquation + "; } }");
    }

    public static SyntaxNode EquationSyntaxTreeToEquationSyntaxNode(SyntaxTree syntaxTree)
    {
        SyntaxNode syntaxNode = syntaxTree.Root.DescendentNodes().First(x => x.Kind == SyntaxKind.ReturnStatement);
        return syntaxNode.ChildNodes().First();
    }
于 2012-03-27T20:53:02.533 に答える
0

次のようにしてみてください。

double result = (double) 3 / 2;

結果 = 1.5

于 2010-04-13T12:43:27.493 に答える
0

おそらくint32の拡張メソッドですか?

于 2010-03-21T14:23:05.437 に答える
0

解決策の 1 つは、彼らのためにこれを行い、その使用方法を教えるメソッドを作成することです。メソッドは常に double を使用し、答えには常に正しい小数点以下の桁数が含まれます。

于 2010-03-21T04:26:40.257 に答える
0

よくわかりませんが、3.0/2.0 を使用して double を取得できると思います。しかし、.0 を接尾辞の別の方法と考えるなら、それも答えではありません :-)

于 2010-03-21T04:33:12.107 に答える
0

私が間違っていなければ、簡単です:

double x = 3D / 2D;
于 2010-03-21T04:15:53.043 に答える
0

今のところRPN Expression Parser ClassまたはbcParserを試すことができますか? これらは非常に小さな式解析ライブラリです。

私は自分の仕事のために静的に型付けされた強力な言語が好きですが、専門家になることに興味のない初心者には適していないと思います。

したがって、残念ながら、あなたの C# の選択は、その対象者にとって最適ではなかった可能性があると言わざるを得ません。

Boo は静的に型付けされているようです。Javascript エンジン、Python、またはその他の動的に型付けされたエンジンを埋め込むことを考えたことがありますか? これらは通常、既存のアプリケーションにプラグインするのはそれほど難しくなく、多くの既存のドキュメントの利点があります。

于 2010-03-21T04:39:01.100 に答える
0

数式を C# コンパイラに渡す前に前処理します。次のようにします。

formula = Regex.Replace(formula, @"(^|[\^\s\+\*\/-])(\d+)(?![DF\.])", "$1$2D")

整数リテラルを double リテラルに変換します。

または、単純なステート マシンを使用して、やみくもに置き換えるのではなく、文字列リテラルまたはコメントに含まれているかどうかを追跡することもできますが、単純な数式の場合は正規表現で十分だと思います。

于 2010-03-21T19:09:51.483 に答える