2012-08-27 43 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如果您使用長。每種變量類型都有一個最大容量。