什么是更好的:强制加倍或加双零?

时间:2016-09-22 12:42:48

标签: java performance

我们有4个int变量:a, b, c, d

需要计算(a * b) / (c * d)

有两种方法可以做到:

1)double result = ((double)(a * b)) / (c * d)

2)double result = (a * b) / (c * d + 0d)

每种方式的进程和缺点是什么?

2 个答案:

答案 0 :(得分:6)

如果你不记得我的话,你的方式确实非常糟糕。

<t name="Tenant1"> <a>1</a> <a>2</a> </t> <t name="Tenant2"> <a>1</a> </t> 仍然在积分算术中计算,因此会遭受环绕。 (这只会让我觉得我认为多余的括号是魔鬼的缩小版本。)在C和C ++中它更糟糕的是,溢出行为是 undefined 并且编译器保留吃饭的权利你的猫。

更糟糕的是,(a * b)也在两个案例中的整数算术中进行了评估!此表达式的结果将转换为c * d

我认为double是最明确的写作方式1.0 * a * b / c / dabc all 在评估之前升级为d类型。我的方式从一开始就指明了你的意图。

答案 1 :(得分:6)

这里最干净的方法之一是依靠在争论传递中发生的自动晋升。只需声明一个方法

double multiplyAndDivide(double a, double b, double c, double d) {
    return (a * b) / (c * d);
}

并将其命名为

return multiplyAndDivide(a, b, c, d);