我正在尝试制作一个将数学方程转移到Java BigDecimal线的小工具。
例如:
A + B * C => A.add(B.multiply(C))
A / B + C => A.divide(B).add(C)
带括号的事情变得讨厌。
A - (B + C) / D => A.substract(B.add(C).divide(D))
A - (B * (C + D)) => A.substract(B.multiply(C.add(D)))
我的方法是递归地做。 例如:A + B * C
1. convert( A + B * C )
2. A.add( convert (B * C) )
3. A.add(B.multiply(C))
支持的数学符号:+ - * / % ( )
我想知道是否有更好的方法来解决这个问题。
这种问题是否有名称?编译器? (对不起,如果没有,我从未对编译器做过任何工作。) 提前谢谢。
答案 0 :(得分:2)
您可能需要查看recursive descent parser,here显示double
值。对BigDecimal
的更改很简单,但您可能需要缩减命名函数。
答案 1 :(得分:1)
为什么不使用Groovy?它直接支持大十进制算法的更好的语法。
BigDecimal a = ...;
BigDecimal b = ...;
BigDecimal c = ...;
Binding binding = new Binding();
binding.setVariable("A", a);
binding.setVariable("B", b);
binding.setVariable("C", c);
GroovyShell shell = new GroovyShell(binding);
BigDecimal value = (BigDecimal) shell.evaluate("a+b*c");
如果你需要,Groovy也有大小数的直接文字语法;
A = 2G
B = 4G
C = 8G
如果您的主要目标只是输入表达式并对其进行评估,那么这是一个很好的简单方法。如果您正在尝试生成代码,那就是另一个故事。