2016-09-26 238 views
0

我正在練習調試,有一個問題,我不確定,它問什麼是錯的,我能做些什麼來解決它我讀了書的章節,但沒有足夠的具體。從書粘貼:類型鑄造int到雙java?

INT A = 26.4 ^ 當你編譯,這是消息:

Test.Java:8:精密 INT一個的可能的損失= 26.4;

要求:整數 發現:雙 1錯誤

我對爲什麼會出現錯誤有了深入瞭解,因爲如何雙比INT更高的優先級,以及如何着一個int一定存儲雙重價值。

我的問題是,有沒有辦法將類型轉換變成一個雙類型的變量?或者是通過將int從int更改爲double來解決此問題的唯一方法?

感謝

+1

即使你強制轉換它,它仍然具有精度損失。只有我知道要解決的辦法是讓「a」成爲雙倍。 –

+0

變量的類型不僅是一個_view_(或類似的)值,您可以稍後使用某種類型的轉換進行擴展。它表示內存空間及其在該空間內的值表示。原始類型「int」是一個32位類型,它以二進制補碼形式存儲整數值。在給這個變量賦值之後,任何進一步的信息(例如關於小數)都會丟失。 – Seelenvirtuose

回答

4

鑄造不會在任何幫助,看看下面的代碼:

//int a = 26.4; // gives compile error 
int a = (int) 26.4; // gives 26 
double b = a; // gives 26.0 
double c = (double) a; // also gives 26.0 
+0

第一行代碼除了編譯錯誤外不會給你任何東西。 – Bohemian

+0

@波希米亞你是對的,我的錯。 –

8

唯一的可能性,你必須是:

  • 類型轉換的doubleint如果您想將您的號碼存儲爲整數:

    int a = (int)26.4 // so a will be 26 
    

    (你會明顯失去精度這樣)

  • 存儲爲double數量,以保持精度:

    double a = 26.4 
    
0

我對爲什麼有一個體面的理解一個錯誤,因爲double比int有更高的優先級,以及int不能一定存儲double值。

儘管「優先順序」不是正確的術語,但您似乎在某些基本級別上了解問題。當您將double投射到int時,您可能會丟失信息。在這種情況下,26.4將被截斷爲26

我的問題是,有沒有辦法將類型轉換爲雙變量?

類型轉換將的類型從一種類型更改爲另一種類型。您不能使用類型轉換來更改變量的類型。一旦a被宣佈爲int,它始終是int。你不能改變這一點。但是,在表達式中使用a中存儲的值可以轉換爲其他類型。

0

有幾種方法可以解決這個問題,哪個是正確的取決於應用程序。

第一至保持左手型爲int,並投右手側到int

int a = (int) 26.4; 

這是正確的,如果四捨五入向零,並限制值的範圍內Integer.MIN_VALUEInteger.MAX_VALUE適合您的應用程序。

接下來,您可能會將左側的類型更改爲double

double a = 26.4; 

這將是正確的,如果使用a進一步的操作可以用double進行。如果您必須具有int值(例如,爲了傳遞給需要int的某些API)或者指定數組的長度或索引,則這不起作用。

或者,您可能需要使用Math API明確控制舍入和範圍檢查。比如,四捨五入到最接近整數,並拋出一個異常,如果該值是一個int太大:

int a = Math.toIntExact(Math.round(26.4)); 
0

我覺得後續的代碼可以幫助你。 在下面的代碼中,它將一個double轉換爲一個整型變量,儘管對於這樣一個簡單的事情來說這是一個有點乏味的過程。

double a=26.4; int b =(int)Math.round(a);

+0

我覺得沒有別的辦法...... – user6883777