如何在 Java 中格式化包含指数的复杂公式

Posted

技术标签:

【中文标题】如何在 Java 中格式化包含指数的复杂公式【英文标题】:How to format a complicated formula that includes exponents in Java 【发布时间】:2017-02-03 19:06:35 【问题描述】:

更新:好的,现在一切正常。我弄清楚我做错了什么。在公式中,rH(相对湿度)应该是一个百分比,即“30%”。分配所需的输入格式是小数形式的百分比,即“.30”。如此简单的修复,我什至没有看到它。我一直输入 0.30 而不将其转换为整个百分比。所以我用一个简单的 .30 * 100 解决了这个问题。谢谢大家的帮助,不知道能不能把所有的答案都打上勾,所以就随便挑了一个。

我正在尝试编写代码来计算露点。我的代码有效,但我使用的公式太简单了,我无法得到准确的答案。我找到了一个更高级的公式,它很长,并且包含一些指数。我一直在尝试找出如何正确格式化它,到目前为止,我唯一能找到的是 math.pow 方法,我认为这对于这个问题来说太简单了。当然,我可能是错的,因为我只使用 java 大约两个星期。

有问题的公式是:

Tdc = (Tc - (14.55 + 0.114 * Tc) * (1 - (0.01 * RH)) - ((2.5 + 0.007 * Tc) * (1 - (0.01 * RH))) ^ 3 - (15.9 + 0.117 * Tc) * (1 - (0.01 * RH)) ^ 14)

这两个指数是 ^3 和 ^4。我将如何用java编写它?正如我所说,该程序确实有效,这是格式化公式的一个简单问题。谢谢。

编辑:我发现这个公式的网站是http://www.angelfire.com/ok5/orpheus/metcal.html

它大约在页面的中间。它确实显示 ^14,而不是 4。我一开始没听懂,我会仔细检查哪个有效。

【问题讨论】:

我想你已经回答了你自己的问题。 Math.pow(double, double) 是将值提升为指数的方法。 你的意思是^4,不是^14,对吧? 我正要问你将如何格式化,但有人在下面展示了它。谢谢你的回答。我只是不认为我可以在那里输入一个等式,我认为它必须是一个数字。就像我说的,我对此很陌生,所以我还不知道我能做多少。 【参考方案1】:

指数是用Math 库完成的。特别是Math.pow(a, b)

https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#pow-double-double-

此外,我会将方程的组成部分拆分为更小的变量,这些变量是有意义的。然后将这些部分组合成最终方程。

例如:double termTc1 = 14.55 + (0.114 * Tc); // Do not use this name, give them meaningful names

【讨论】:

有机会我会看看它是如何工作的,代码在另一台计算机上。【参考方案2】:

我会这样格式化:

double tdc = tc - (14.55 + 0.114 * tc) * (1 - (0.01 * rh))
                - Math.pow((2.5 + 0.007 * tc) * (1 - (0.01 * rh)), 3)
                - (15.9 + 0.117 * tc) * Math.pow(1 - (0.01 * rh), 14);

但是,它确实在您的公式中显示了两个潜在错误:

第二个指数真的应该是 14,而不是 4? 第二个指数的乘数表达式真的应该在指数之外吗?

也许(?)正确的公式是这样的,用对齐来显示公式的模式:

double tdc = tc -          (14.55 + 0.114 * tc) * (1 - (0.01 * rh))
                - Math.pow(( 2.5  + 0.007 * tc) * (1 - (0.01 * rh)), 3)
                - Math.pow((15.9  + 0.117 * tc) * (1 - (0.01 * rh)), 4);

这也表明子表达式 (1 - (0.01 * rh)) 可以预先计算,就像 answer by Eric Duminil 所做的那样。

【讨论】:

实际上,该网站显示的是 14 而不是 4。我会尽快仔细检查。 我真的很喜欢这种对齐方式,它使解析公式变得更加容易。 好的,我继续按照你们两个建议的方式进行操作,简化并更改了第二个乘数。正如我在下面的评论中所说,这几乎但并不完全有效。一定是其他地方的数学不好。我输入华氏度(作业需要),然后转换为摄氏度,做露点公式,然后将答案转换回华氏度。我第一次使用的简单版本仍然给了我最接近正确的答案。【参考方案3】:

正如你所建议的,使用Math.pow 函数:

    double tdc = Tc -
            (14.55 + 0.114 * Tc) * (1 - (0.01 * RH)) -
            Math.pow(((2.5 + 0.007 * Tc) * (1 - (0.01 * RH))), 3) -
            (15.9 + 0.117 * Tc) * Math.pow((1 - (0.01 * RH)), 14);

【讨论】:

啊,好的。我不确定我是否可以像这样将整个方程放在那里,我认为它只能使用单个整数或双精度数。谢谢。 很高兴我能帮上忙。 我不知道。 稍后我会尝试看看这是否可行,因为代码在另一台计算机上,我无法使用它。 之前不是我投反对票,但我现在投反对票是因为 that 不是同一个公式。指数具有最高优先级,因此您在 pow() 调用中有太多内容,例如见my answer。【参考方案4】:

14 作为指数非常不寻常,但根据“Linsley et al. (1989)”似乎是正确的

如果您使用局部变量,则应使用小写名称。

最后,您可以定义一个等于1 - 0.01 * rh 的临时变量,因为您连续使用了 3 次:

double tc = 23; // just an example
double rh = 67; // just an example
double rh2 = 1 - (0.01 * rh);
double tdc = tc - (14.55 + 0.114 * tc) * rh2 -
        Math.pow((2.5 + 0.007 * tc) * rh2, 3) -
        (15.9 + 0.117 * tc) * Math.pow(rh2, 14);

【讨论】:

谢谢,我试试看。现在无法处理它,因为代码在另一台计算机上。 我得到公式的网站实际上显示的是 14,而不是 4。我会仔细检查一下。 那是我第一次看到任何以 14 为指数的公式,但谁知道呢?你有参考吗? 我把网站链接放在上面的原帖里。但是在这里,我仍然在剪贴板上有它angelfire.com/ok5/orpheus/metcal.html 到目前为止,您的版本取得了最大的成功。我仍然无法复制我给出的示例,但它更接近了。我会继续努力。现在可能在其他地方搞砸了。如果需要,我会发布完整的代码,但这是一项家庭作业,我想自己做尽可能多的事情。

以上是关于如何在 Java 中格式化包含指数的复杂公式的主要内容,如果未能解决你的问题,请参考以下文章

如何计算Java中操作的耗时?

将任何命题公式转换为 CNF 格式的复杂性

如何在 MATLAB 中将指数曲线拟合到阻尼谐波振荡数据?

JAVA中如何取得EXCEL中确定已知的单元格所包含的列数 急急急!!!

如何在WORD文档里输入复杂的公式?

Excel,复杂的条件格式