2012-08-27 45 views
-2

为什么:的Java计算

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

+5

听起来像作业给我! –

+0

第一个应该打印'3' ...你期待什么?检查有关运算符优先级的Java教程:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html – birryree

+0

@OpMt我不理解您的编辑。 –

回答

2

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

Order of operations。首先计算括号,得到(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?

浮点运算。有关于浮点数学的lots of questions here on Stack Overflow,快速谷歌搜索可能会比你所需要的更多。但Wikipedia article可能是一个好的开始。

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

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

+0

有这个问题两个相关的好奇和有用的链接: https://blogs.oracle.com/CoreJavaTechTips/entry/the_need_for_bigdecimal http://epramono.blogspot.com.es/2005/01/double- VS-bigdecimal.html – angelcervera

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) 

整数溢出。

+0

因此,对于整数溢出,为什么会变成负值? – OpMt

+0

@OpMt:因为'2147483647'是'0b01111111111111111111111111111111'并且它溢出到'0b10000000000000000000000000000000'中,它是'-2147483648'作为一个带符号的二进制补码,32位整数,这就是'int'。 – Ryan

+0

@Nambari这是不正确的。它与二进制表示和[2s恭维]有关(http://en.wikipedia.org/wiki/2s_compliment)。行为是明确的,并且很好理解。 –

1
  1. (3 + 7 + 10) * (1000 - 8)/992 - 1720 * 992/992 - 17,这归结为20 - 17,因此3,不20
  2. 浮点运算本质上是不准确的。
  3. 签名溢出是Java中良好定义的行为。在Java中,21474836470x7fffffff; 0x7fffffff + 10x80000000,换句话说,-2147483648
0

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

0

关于#3:

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