假设我需要在整数运算中计算3 * (2 / 3) = 2
但3 * (2 / 3) = 0
。因此,看起来我应该使用浮点算术3 * (2.0 / 3) = 2.0
和强制转换浮点结果int
。
有意义吗?你怎么会避免在这里施展?
答案 0 :(得分:5)
在此特定示例中,您最好将表达式重新排列为3 * 2 / 3
或3 / 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)
不同的结果,即使数学上两个表达式都相等。尽管如此,根据您要解决的任务,两个表达式都可能是正确的。我确实错过了对此的明确陈述。
如果您正在寻找最接近数学正确值的整数,则单独计算分母和分母,然后执行除法。这样就不会发生中间错误。如果不是,你需要重新表述你的问题。