-2

为什么:

System.out.println((3 + 7 + 10) * (1000 - 8) / (992 - 17))

打印3而不是20

System.out.println (2.0 + 1.0/2 + 1.0/6 + 1.0/24 + 1.0/120)

打印2.7166666666666663而不是2.716666667

System.out.println (2147483647 + 1)

打印-2147483648而不是2147483648

4

5 回答 5

4
System.out.println((3 + 7 + 10) * (1000 - 8) / 992 - 17)

这会打印 3 而不是 20,因为...基本数学...

  • 3 + 7 + 10 = 20
  • 1000 - 8 = 992
  • 20 * 992 / 992 - 17 = 20 - 17
  • 20 - 17 = 3

System.out.println (2.0 + 1.0/2 + 1.0/6 + 1.0/24 + 1.0/120)

这是一个浮点精度错误。


System.out.println (2147483647 + 1)

整数溢出。

于 2012-08-27T18:46:32.390 回答
2

System.out.println((3 + 7 + 10) * (1000 - 8) / 992 - 17) 打印 3 而不是 20?

操作顺序。首先计算括号得到 (20) * (992) / 992 - 17。然后,从左到右乘除得到 20 - 17。最后,减法得到 3。

System.out.println (2.0 + 1.0/2 + 1.0/6 + 1.0/24 + 1.0/120) 打印 2.7166666666666663 而不是 2.716666667?

浮点运算。Stack Overflow 上有很多关于浮点数学的问题,而快速的谷歌搜索可能会比你需要的更多。不过,维基百科的文章可能是一个好的开始。

System.out.println (2147483647 + 1) 打印 -2147483648 而不是 2147483648?

溢出。Java 中整数的最大值为 2^31 - 1 或 2,147,483,647。当您向该值添加一个时,它会环绕到您看到的值。它与使用2s 恭维的值的二进制表示有关。

于 2012-08-27T18:50:27.633 回答
1
  1. (3 + 7 + 10) * (1000 - 8) / 992 - 17is 20 * 992 / 992 - 17,归结为20 - 17,因此 is 3, not 20
  2. 浮点运算本质上是不准确的。
  3. 有符号溢出是 Java 中定义明确的行为。21474836470x7fffffffJava;0x7fffffff + 10x80000000,或者,换句话说,-2147483648
于 2012-08-27T18:48:21.010 回答
0

无法理解您试图通过第一个打印语句传达的内容,输出没有任何问题。在第三种情况下,int 是 32 位,并且数字超出范围。在大数字后放一个 l (待处理的时间一样长)以获得正确的输出。

于 2012-08-27T18:50:39.220 回答
0

关于#3:

如果使用 long,System.out.println (2147483647 + 1) 将打印出 2147483648。每个变量类型都有一个最大容量。

于 2012-08-27T18:51:51.640 回答