【问题标题】:How to calculate integer expression in Java如何在 Java 中计算整数表达式
【发布时间】:2011-11-16 14:16:51
【问题描述】:

假设,我需要在整数算术中计算 3 * (2 / 3) = 23 * (2 / 3) = 0。所以,看起来我应该使用浮点运算3 * (2.0 / 3) = 2.0 并将浮点结果castint

这有意义吗?你会如何避免在这里投射?

【问题讨论】:

  • 你不能像 (3 * 2) / 3 这样移动括号吗?

标签: java math integer floating-point


【解决方案1】:

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

使用浮点数学是更通用的解决方案,但您需要注意舍入问题。一般来说,当xy 是浮点数时,您不应期望x * (y / x) 会准确地给出y

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

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

简单地将结果强制转换int并不是一个好主意,因为浮点数是不精确的,这样的强制转换只会截断数字。 p>

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      否则,强制转换(或截断)是不可避免的。

      【讨论】:

        【解决方案4】:

        我个人会将等式重新排列为:

        3 / 3 * 2 = 2
        

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

        【讨论】:

          【解决方案5】:

          这是因为整数除法。在这些类型的表达式中,你最好使用浮点数,是的。

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

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-06-11
              • 1970-01-01
              • 2017-06-19
              • 2011-11-07
              • 2017-11-20
              • 2017-10-21
              • 2017-02-08
              相关资源
              最近更新 更多