将数学方程转换为Java BigDecimal行

时间:2013-02-08 01:28:37

标签: java

我正在尝试制作一个将数学方程转移到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))

支持的数学符号:+ - * / % ( )

我想知道是否有更好的方法来解决这个问题。

这种问题是否有名称?编译器? (对不起,如果没有,我从未对编译器做过任何工作。) 提前谢谢。

2 个答案:

答案 0 :(得分:2)

您可能需要查看recursive descent parserhere显示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

如果您的主要目标只是输入表达式并对其进行评估,那么这是一个很好的简单方法。如果您正在尝试生成代码,那就是另一个故事。