2016-10-14 71 views
1

我不得不這樣計算:1 * 5000 * 500 /(10000 * 24645.16239360158)爲什麼Java的給出分數不同的答案,不同的括號

但後來意識到我應該1000乘以我得到2個不同的答案取決於我如何做。但我不確定爲什麼,因爲括號的放置對於乘法不應該有影響。希望有任何見解! System.out.println(Double.toString(1000 * 1 * 5000 * 500 /(10000 * 24645.16239360158)));以及其他類型的文件。

輸出

-7.283243937828597

肯定不正確,因爲它是負

的System.out.println(Double.toString(1000 *(1 * 5000 * 500 /(10000 * 24645.16239360158)) ));

在另一方面

,輸出

10.143978603480635

(正確)

基本上在第二種情況下,我們通過之後,我們已經計算出它乘以1000的結果,並以某種方式工作。

謝謝!

+8

'1000 * 1 * 5000 * 500'不適合在'int'。 – user2357112

回答

1

這個表達式1000 * 1 * 5000 * 500 /(10000 * 24645.16239360158),首先計算1000 * 1 * 5000 * 500,結果是-1794967296,溢出。

該表達式1000 *(1 * 5000 * 500 /(10000 * 24645.16239360158))溢出不會發生。

2

您需要知道int * int會產生一個int5 * 5)。並且int * double產生double5 * 5.0)。

正如您可能知道的那樣,這些數據類型具有不同的最大大小和以不同的方式存儲值。

下面是其中一些:

enter image description here

您可以使用確切的範圍Integer.MAX_VALUEInteger.MIN_VALUE。 如果您需要超過這些值,但也希望有一個int,則應該使用類BigInteger。它可以處理任意大的integers。 否則你會有所謂的overflow,當你做Integer.MAX_VALUE + 1結果將是Integer.MIN_VALUE。如果你記得這個數字是如何以字節存儲的,例如111那麼+1將返回1000,但沒有地方來存儲第一個1,你會收到000這就是MIN_VALUE

你也應該知道,當你計算5/2不會返回2.52,你分上下兩int,其結果也將是一個int。如果你想有一個double,那麼你需要做這樣的事情5/2.0(5 + 0.0)/2

+2

原始類型的MIN和MAX值只是問題的一個方面。運算符優先級(在這種情況下除法之前的乘法),你沒有解決,這可能是令人困惑的OP,因爲它們明確地說「放大括號對於乘法不應該影響事實上的事情」。 – walen

0

任何表達式的評估都由運算符優先級解析器完成。如果你想改變優先級的優先級,你將不得不使用括號。

在第一種情況下'/'和'*'具有相同的優先級table

在第二種情況下,'*'的優先級高於'/'。這就是爲什麼你獲得不同的價值作爲輸出。

0

這是因爲Java的隱式類型轉換。默認情況下Java會使用int。正如user2357112所評論的,該數字對於int而言太大。

如果你想讓你的第一個版本工作,添加一個「d」來告訴Java使用一個double。 (d); D:1000d * 1 * 5000 * 500 /(10000 * 24645.16239360158); System.out.println(d);

你會得到: 10.143978603480635

相關問題