2011-08-28 76 views
70

這是一個基本問題,但我找不到答案。我研究過浮點算術和其他一些主題,但似乎沒有解決這個問題。我相信我只是有錯誤的術語。Java中的整數部分

基本上,我要帶兩個量 - 完成,總 - 分和他們來了(多少已完成)的百分比。數量爲long s。這裏的設置:

long completed = 25000; 
long total = 50000; 

System.out.println(completed/total); // Prints 0 

我試過的結果重新分配到雙 - 它打印0.0。我哪裏錯了?

順便說一下,下一個步驟是通過100乘以這個結果,我假設一旦這個小的障礙是跨過應該很容易。

順便說一句,這裏不是作業,只是普通的舊數字(可能今天編碼太多)。

+2

你嘗試(雙)已完成/(雙)總...,然後分配結果雙? –

+2

嘗試完成* 1.0 /總計 – user12384512

回答

106

轉換的輸出爲時已晚;計算已經發生在整數運算中。你需要轉換輸入double

System.out.println((double)completed/(double)total); 

注意,你實際上並不需要轉換他們兩個;只要一個是double,另一個將被隱式轉換。但我更喜歡做這兩個,爲了對稱。

+0

Java中是否有任何關鍵字將兩個數字相除**'Math.floorDiv(num1,num2)'** – Rudra

+0

@Rudra - 我不確定你在問什麼。如果'num1'和'num2'是正整數,那麼'num1/num2'會給你你想要的。否則,它只是'Math.floor(num1/num2)'。 –

3

都轉換completedtotaldouble或至少做時等分它們轉換成double。即投下的變數不僅僅是結果的兩倍。

公平的警告,與floatdouble工作時有一個floating point precision problem

1

如果你沒有做明確的劃分,然後整數除法將使用(這就是爲什麼你會得到0)前投了兩個值之一爲float。您只需要將兩個操作數中的一個設置爲浮點值,以便使用正常的除法(其他整數值會自動轉換爲浮點數)。

float completed = 50000.0f; 

只要嘗試,並會被罰款。

9

你甚至不需要雙打這個。只需乘以100 第一個然後分開。否則,結果會小於1,並被截斷爲零,如你所見。

編輯:或者如果溢出是可能的,如果它會溢出(即被除數比922337203685477581更大),由100首先除以除數。

+0

只需要清楚:結果是否會舍入*或* floiled *爲零?巨大差距。 – klaar

0
In Java 
Integer/Integer = Integer 
Integer/Double = Double//Either of numerator or denominator must be floating point number 
1/10 = 0 
1.0/10 = 0.1 
1/10.0 = 0.1 

只要輸入其中任何一個。

0

正如JLS解釋,整數運算是非常簡單的。

如果比的變速操作者以外的整數運營商具有長型的至少一個操作數,則該操作被執行使用64位精度,數值運算符的結果是類型長的。如果另一個操作數不長,則首先擴展(§5.1.5)以通過數字提升鍵入long(§5.6)。

否則,該操作使用32位精度執行,並且數字運算符的結果爲int類型。如果任一操作數不是int,則首先將其擴展爲通過數字提升來鍵入int。

所以,使其短,操作總是導致int在唯一的例外是在它裏面一個long值。

int = int + int 
long = int + long 
int = short + short 

注意操作的優先級是很重要的,所以如果你有

long = int * int + long 

將導致intint * int操作,這將是在操作過程中促進成longint + long

-3

由於您的輸出結果是雙精度型,您應該在完成變量或總變量或兩者的同時將其分成兩部分。

所以,正確的implmentation將是:

System.out.println((double)completed/total); 
+2

是的,這就是六年前接受的答案。 –