我正在尝试构建一个表达式解析器,用于计算数学表达式的值。然而,问题在于某些类别的表达式,其评估为无理数。
让我们举个例子(√2)²
这应该评估为2
。但是由于程序编码的逻辑,它返回一个小数点数。
首先评估√2
等于1.4142135
,然后将结果平方给出1.9999998
目前,所有可以做的是通过Mathematica将表达式发送到JLink,然后使用结果。然而,这需要第三方软件的帮助。
我想知道是否可以在java中实现这一切。
答案 0 :(得分:2)
是的,您当然可以在Java中实现表达式解析器。我认为你的基本错误不是Java编程,而是程序设计。
你不应该在尽可能晚地评估冲刺。相反,您应该将(sqrt(n))^2
到sqrt(n)*sqrt(n)
和sqrt(n)*sqrt(n)
等表达式评估为n
。只有这样才能考虑将n
转换为等效的浮点数。
您在方法中发现的错误是浮点运算的一个特征,您将难以对抗。更好的策略是通过对符号表达式实现符号操作来解决它。
答案 1 :(得分:0)
Double value = new Double(2);
Double power = new Double(2);
Double result = Math.pow(value, power);
result = Math.sqrt(result);
System.out.print(result);