2011-11-16 49 views
1

假設我需要計算整數運算中的3 * (2/3) = 2,但需要計算3 * (2/3) = 0。所以,看起來我應該使用浮點運算3 * (2.0/3) = 2.0的浮點結果轉換爲int如何在Java中計算整數表達式

它有道理嗎?你會如何避免在這裏投射?

+3

難道你不能移動像(3 * 2)/ 3這樣的假設嗎? – Tudor

回答

1

你不能避免施法。您可以使用整數除法,也可以使用整數除法,但參數和結果將處於浮點狀態。 您可以嘗試在表達式部分移動以將整數除法移到頂層。在你的情況下,你可以將3 * (2/3)轉換爲(3 * 2)/3這將導致2沒有任何浮點操作。

5

在這個特定的例子中,您可能會更好地重新排列表達式3 * 2/33/3 * 2。這樣你就可以只用整數數學得到確切的結果。

使用浮點數學是更通用的解決方案,但您需要了解舍入問題。一般來說,當xy是浮點數時,您不應該認爲x * (y/x)恰好會給出y

如果你知道這個結果是一個整數,或者只是希望它四捨五入到最接近的整數,你可以使用Math.round()

Math.round(3 * (2f/3)) 

只需鑄造的結果int是不是一個好主意因爲浮點數是不精確的,而這樣的投射簡直就是truncate的數字。

1

*/具有相同的優先級,所以省略括號會爲您提供示例的正確結果。

否則鑄造(或截斷)是不可避免的。

1

個人而言,我會重新安排公式爲:

3/3 * 2 = 2 

但不知道如果多數民衆贊成你所需要的。你可以嘗試在float上進行計算,然後使用round()將其向上或向下舍入到最近的integar。

1

這是因爲整數除法。在這些表達式中,最好使用float,是的。

只有在使用複合操作符時,才能避免顯式強制轉換。複合運算符會爲您自動執行轉換。

int a = 3; 
a *= (2.0/3); 
System.out.println(a); 
0

究竟是你想達到什麼目的?使用整數算術的結果取決於你設置圓括號的位置。 (a/b) * (c/d) * (e/f),就像你自己注意到的那樣,通常會導致與(a*c*d)/(b*d*f)不同的結果,即使數學上兩個表達式都是相等的。儘管如此,根據您想要解決的任務,這兩種表達式都可能是正確的。我確實錯過了一個明確的說明。

如果您正在尋找最接近數學正確值的整數,只需分別計算提名者和分母,然後執行除法運算。這種方式不會發生中間錯誤。如果不是,你需要重新制定你的問題。