如何强制c#二进制整数除法返回双精度?
如何强制双x=3/2;返回1.5英寸x,不带D后缀或铸件?是否存在任何类型的操作员过载?或者一些编译器选项 令人惊讶的是,添加铸造或后缀并不是那么简单,原因如下: 业务用户需要编写和调试自己的公式。目前,C#像DSL(领域特定语言)一样被使用,因为这些用户不是计算机科学工程师。所以他们所知道的就是如何编辑和创建几种类型的类来保存他们的“业务规则”,这些规则通常只是数学公式 但他们总是假设双x=3/2;将返回x=1.5 但是在C#中,返回1 答:他们总是忘记这一点,浪费时间调试,给我打电话寻求支持,然后我们解决它。 B.他们认为这很难看,损害了他们业务规则的可读性 正如你所知,DSL需要更像自然语言 对。我们正计划迁移到Boo,并在此基础上构建DSL,但这是未来的发展方向 是否有一个简单的解决方案使双x=3/2;通过类外部的东西返回1.5,这样用户就看不见了 谢谢!如何强制c#二进制整数除法返回双精度?,c#,casting,int,dsl,division,C#,Casting,Int,Dsl,Division,如何强制双x=3/2;返回1.5英寸x,不带D后缀或铸件?是否存在任何类型的操作员过载?或者一些编译器选项 令人惊讶的是,添加铸造或后缀并不是那么简单,原因如下: 业务用户需要编写和调试自己的公式。目前,C#像DSL(领域特定语言)一样被使用,因为这些用户不是计算机科学工程师。所以他们所知道的就是如何编辑和创建几种类型的类来保存他们的“业务规则”,这些规则通常只是数学公式 但他们总是假设双x=3/2;将返回x=1.5 但是在C#中,返回1 答:他们总是忘记这一点,浪费时间调试,给我打电话寻求支持
韦恩很简单,如果我没弄错的话:
double x = 3D / 2D;
不,没有解决方案可以使
3/2
返回1.5
考虑到您的约束的唯一解决方法是不鼓励用户在公式中使用文字。鼓励他们使用常量。或者,如果他们真的需要使用文字,鼓励他们使用带小数点的文字。一个解决方案是编写一个为他们这样做的方法,并教他们使用它。您的方法总是采用双精度,并且答案总是有正确的小数位数。我不太确定,但我相信您可以使用3.0/2.0获得双精度 但是,如果你认为.0只是另一种后缀形式,那么它也不是答案:-)也许你现在可以试试,或者?这些是非常小的表达式解析库 我喜欢在自己的工作中使用强大的静态类型语言,但我认为它们不适合对成为专业人士没有兴趣的初学者 所以我不得不说,不幸的是,你选择的C#可能对那些观众来说不是最好的
Boo似乎是静态键入到的。您是否考虑过嵌入Javascript引擎、Python或其他动态类型引擎?这些通常不难插入到现有应用程序中,并且您可以从大量现有文档中获益。可能是int32上的扩展方法?在将公式传递给c编译器之前对其进行预处理。做一些类似于:
formula = Regex.Replace(formula, @"(^|[\^\s\+\*\/-])(\d+)(?![DF\.])", "$1$2D")
将整数文本转换为双文本
或者,您可以使用一个简单的状态机来跟踪您是否在字符串文本或注释中,而不是盲目地替换,但对于简单的公式,我认为正则表达式就足够了。尝试这样做:
double result = (double) 3 / 2;
结果=1.5永远不要说永远。。。
(双)3/2解决方案看起来不错
但它在4+5/6时失败了
试试这个:
捐赠给公共领域,由SymbolicComputing.com免费使用。它是alpha,但你可以试试,我只在几个测试中运行了它,我的网站和软件应该很快就会上线。 它使用微软的Roslyn,如果一切顺利,它会在每个数字后面加上“d”。Roslyn也是alpha,但它会解析相当多的C
公共静态字符串AddDSuffixesToEquation(字符串不等式)
{
SyntaxNode SyntaxNode=等式到SyntaxNode(不等式);
List branchs=syntaxNode.groundNodesAndSelf().ToList();
List numericBranchIndexes=新列表();
列表替换=新列表();
联合淋巴结置换;
字符串lStr;
Int32 L;
对于(L=0;L=0;L--)
{
ReplaceMBranchs=replacement.groundsNodesAndSelf().ToList();
replacement=replacement.ReplaceNode(replacementMeBranchs[numericBranchIndexes[L]],replacements[L]);
}
返回replacement.ToString();
}
公共静态SyntaxNode等式到SyntaxNode(字符串不等式)
{
SyntaxTree=等式到SyntaxTree(不等式);
返回方程SyntaxTree方程SyntaxNode(树);
}
公共静态SyntaxTree等式SyntaxTree(字符串不等式)
{
return SyntaxTree.ParseCompilationUnit(“使用系统;类Calc{public static object Eval(){return”+不等式+”;}}”);
}
公共静态SyntaxNode等式SyntaxTreeTeEquationSyntaxNode(SyntaxTree SyntaxTree)
{
SyntaxNode SyntaxNode=syntaxTree.Root.groundNodes().First(x=>x.Kind==SyntaxKind.ReturnStatement);
返回syntaxNode.ChildNodes().First();
}
发问者说:不带D后缀或castingWell,除了有类似解决方案的解决方案。。你也提到了文字,但我很可能在第一句话之后或者在你说完之前评论过。在我们使用DSL之前,鼓励他们使用3.0/2.0的建议将起作用。有些用户从不阅读手册。取而代之的是,他们只是遵循示例代码,用户数量正在增长,无法亲自教授所有这些代码。因此,我将修改所有示例代码和公式,使其使用3.0/2.0语法。这样,新用户将自动模仿。而且他们很聪明
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();
}