有没有理由将Math.pow()与文字一起使用而不是结果本身?

时间:2016-07-27 15:39:22

标签: java formula

我目前正在查看现有代码。编写现有公式的方法有很多种。我偶然发现了几十个代码实例,例如Math.pow(10.0D, 3.0D)Math.pow(300.0D, 2.0D)以及类似1.5D * 1000.0D的内容。

现在,在我继续将所有这些替换为各自的结果(1000d90000d1500d以获取上述示例之前)之前,我想知道是否有任何结果保持原始符号的充分理由?

我唯一想到的就是保持代码与建模公式的相似性。还有其他原因我看不到吗?

3 个答案:

答案 0 :(得分:7)

这基本上都与可读性有关。在处理时间时,您会更常见到这种代码风格,例如:

Thread.sleep(5 * 60 * 1000);

这种风格使线程更加明显地睡了5分钟。在处理数学公式时,通常会保持公式的每个值都保持不变,因此显而易见的是使用了哪个公式并且正确使用了公式。

答案 1 :(得分:5)

为了便于阅读,程序员喜欢长篇大论:例如,知道在正常的一天有86400秒确实属于酒吧测验的参与者,而不是程序员。

但是说,我倾向于使用Math.pow

主要原因是它可能不是编译时可评估的常量表达式,尽管可能依赖于编译器。

您可能会发现pow(x, y)已实现为exp(y log x):由于浮点数的原因,xy出现了令人惊讶的微不足道的值,因此可以“关闭” double只能精确到15位十进制有效数字。

(目前JLS只指定了一个带有两个Math.pow参数的double函数。如果你要使用整数文字,那么编译器会自动将它们转换为double类型。调用该函数。似乎作者正在使用double文字来防止将来引入Math.pow的重载的可能性。)

在您的特定情况下,我会考虑将Math.pow(300.0D, 2.0D)替换为300.0 * 300.0,将Math.pow(10.0D, 3.0D)替换为10.0 * 10.0 * 10.0。但请检查这些值是否与原始值相同;并仔细调查任何差异的影响。

答案 2 :(得分:3)

可以更轻松地验证公式是否已正确转换为代码。还要考虑是否应该用命名常量替换其中一些数字文字,以进一步提高可读性。在不知道上下文的情况下,它看起来很多"magic numbers".