【问题标题】:Java calculation with ints and longs returns different values with or without parentheses. Why?使用 int 和 long 进行 Java 计算会返回带或不带括号的不同值。为什么?
【发布时间】:2019-07-30 15:10:22
【问题描述】:

这是一个简单的问题示例:

public class IntVsLong {

    public static void main(String[] args) {
        int a = 3;
        int b = 3;
        long n = 549382313570L;
        String s = "epsxyyflvrrrxzvnoenvpegvuonodjoxfwdmcvwctmekpsnamchznsoxaklzjgrqruyzavshfbmuhdwwmpbkwcuomqhiyvuztwvq";

        System.out.println(a * n/s.length() + b); //returns 16481469410
        System.out.println(a * (n/s.length()) + b); //returns 16481469408
    }

}

第一种情况,不带括号,返回 16481469410。第二种情况,带括号,返回 16481469408。为什么?

【问题讨论】:

  • 因为你改变了评估的顺序。
  • 你好。我认为这是一道数学题……你的括号改变了计算顺序。
  • @takendarkk 据我所知,Java 遵循数学规则,如果我在除以 s.length() 之前将 a 与 n 相乘 VS 先将 n 与 s.length() 相除应该没有区别然后与 a 相乘。 b 在这两种情况下都是最后添加的。此外,这两个结果的差异只有 2,如果我先添加 b 而不是操作,差异会大得多。请重新阅读代码或更详细地解释。

标签: java int long-integer


【解决方案1】:

这是因为计算顺序不同,并且整数数学向下舍入。举个小数字的例子来说明这一点。

3 * (5 / 2) = 3 * (2) = 6

没有括号

3 * 5 / 2 = 15 / 2 = 7

运算是从左到右计算的,没有括号,当你到达除法语句时,你会丢失一些信息,因为整数不能包含小数。您越早丢失此信息一般最终结果就越不准确。

【讨论】:

  • “和整数数学四舍五入”确实是至关重要的一点,所以你的答案应该是最重要的,imo。
  • @rtpax 啊,答案是“整数数学四舍五入”。谢谢,这是我在理解问题时所缺少的。
【解决方案2】:

如果两个操作数都是整数类型,Java中的/操作符代表整数除法,意味着除法提示被丢弃。在您的情况下,结果之间的差异为 2,这意味着提醒 n/s.length() 操作大于 2 / a 并且明显小于 1。因此,在 a * n/s.length() 的情况下,此提醒乘以 a 并为您提供多余的 2在答案中。

【讨论】:

  • “Java 中的 / 运算符表示整数除法”……还有浮点除法。使用/ 本身并不是错误,而是使用整数操作数。
猜你喜欢
  • 2020-07-02
  • 1970-01-01
  • 2017-04-03
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
相关资源
最近更新 更多