我们有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)
每种方式的进程和缺点是什么?
答案 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 / d
,a
,b
和c
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);