如何在Java中计算整数表达式

时间:2011-11-16 14:16:52

标签: java math integer floating-point

假设我需要在整数运算中计算3 * (2 / 3) = 23 * (2 / 3) = 0。因此,看起来我应该使用浮点算术3 * (2.0 / 3) = 2.0强制转换浮点结果int

有意义吗?你怎么会避免在这里施展?

6 个答案:

答案 0 :(得分:5)

在此特定示例中,您最好将表达式重新排列为3 * 2 / 33 / 3 * 2。这样,您将仅使用整数数学获得精确的结果。

使用浮点数学是更通用的解决方案,但您需要了解舍入问题。一般情况下,当x * (y / x)y为浮点数时,您不应期望x能够准确地y

如果您知道结果是整数,或者只是想将其四舍五入到最接近的整数,则可以使用Math.round()

Math.round(3 * (2f / 3))

简单地投射结果到int不是一个好主意,因为浮点数是不精确的,而这样的演员只是截断数字。

答案 1 :(得分:1)

你不能避免施法。你可以使用整数除法,也可以使用完全除法,但是参数和结果将是浮点数。 您可以尝试移动表达式部分以将整数除法带到顶层。在您的情况下,您可以将3 * (2 / 3)转换为(3 * 2) / 3,这将导致2没有任何浮点运算。

答案 2 :(得分:1)

*/具有相同的优先级,因此省略括号将为您提供示例的正确结果。

否则,铸造(或截断)是不可避免的。

答案 3 :(得分:1)

就个人而言,我会重新安排等式:

3 / 3 * 2 = 2

但不确定那是不是你需要的东西。您可以尝试对float进行计算,然后使用round()将其向上或向下舍入到最接近的整数。

答案 4 :(得分:1)

这是因为整数除法。在这些表达式中,最好使用float,是的。

只有在使用复合运算符时才能避免显式转换。复合运算符为您自动执行。

int a = 3;
a *= (2.0/3);
System.out.println(a);

答案 5 :(得分:0)

你想要达到什么目的?使用整数运算,结果取决于您为括号设置的位置。正如您自己注意到的那样,(a/b) * (c/d) * (e/f)通常会导致与(a*c*d) / (b*d*f)不同的结果,即使数学上两个表达式都相等。尽管如此,根据您要解决的任务,两个表达式都可能是正确的。我确实错过了对此的明确陈述。

如果您正在寻找最接近数学正确值的整数,则单独计算分母和分母,然后执行除法。这样就不会发生中间错误。如果不是,你需要重新表述你的问题。