Java'da Tam Sayıya İki Katına Yayın Yap


348

Döküm için herhangi bir şekilde java.lang.Doublekarşı java.lang.Integer?

Bir istisna atar

"java.lang.ClassCastException: java.lang.Double, java.lang.Integer ile uyumsuz"

Yanıtlar:


464

A Doublebir değildir Integer, bu yüzden oyuncular çalışmaz. Double Sınıf ve double ilkel arasındaki farka dikkat edin . Ayrıca a'nın a Doubleolduğunu unutmayın Number, bu nedenle intValue değeri ilkel olarak almak için kullanabileceğiniz yönteme sahiptirint .


2
Oyunculuk yapmamam. Örneğin, 13.22222 yerine 13 değil, Integer nesnesi almak gerekir.
4lex1v

181
Sadece çağrı intValue()sonra.
hvgotcodes

6
Sıfırlarla başa çıkmayı unutmayın.
pimlottc

13
Bunun yalnızca Double'in tamsayı kısmını döndürdüğünü unutmayın, bu nedenle 13.666667 veya 13,9 için 14 değil, 13 elde edersiniz. En yakın tamsayıyı istiyorsanız, cevabıma bakın: stackoverflow.com/a/24816336/1450294
Michael Scheper

2
Eğer uygulanmasına bakarsanız, intValue()sadece doublebir int.
carlo.marinangeli

566

İntValue () yöntemini kullanarak int değerini açıkça almanız gerekir:

Double d = 5.25;
Integer i = d.intValue(); // i becomes 5

Veya

double d = 5.25;
int i = (int) d;

67
Teşekkür ederim. Çok açık. Kabul edilen cevap benim için aptalca bir soru sormak için azarlanıyor gibi. Ama cevabınız çok cömert.
Buddhika Ariyaratne

2
Çift değer tam sayı aralığının dışında olduğunda ne olur? (2 ^ 33 gibi)
nikdeapen

5
Herhangi bir çift değer> 2^31 - 1 (Integer.MAX_VALUE)taşacak.
anubhava

3
Ve bu arada, çiftten int'e atıldığında, hem tamsayı kısmını hem pozitif hem de negatif sayılar için tutar ve yuvarlamayı umursamaz. örneğin 1.6 -> 1, 1.4 -> 1, -1.6 -> -1, -1.4 -> -1,
Eric Wang

51

Tuzakları örtmeden ve arkasındaki akıl yürütmeden diğer cevapları anlamak imkansız .

Doğrudan Integerbir Doublenesneye yayınlayamazsınız. Ayrıca Doubleve Integerdeğişmez nesnelerdir, böylece onları hiçbir şekilde değiştiremezsiniz.

Her sayısal sınıfı bir sahiptir ilkel bir alternatif ( Doublevs double, Integervs int, ...). Bu ilkellerin küçük harfle (örn. int) Başladığını unutmayın . Bu bize onların sınıf / nesne olmadığını söyler. Bu da yöntemlerinin olmadığı anlamına gelir. Aksine, sınıflar (örn. Integer) Bu ilkellerin etrafında kutular / ambalajlar gibi davranırlar, bu da onları nesneler gibi kullanmayı mümkün kılar.

Strateji:

Bir dönüştürmek için Doublebir karşı Integerbu stratejiyi takip etmek gerekir:

  1. DoubleNesneyi bir ilkeye dönüştürün double. (= "kutudan çıkarılıyor")
  2. İlkel dönüştürme doublebir nesnenin üstüne int. (= "döküm")
  3. İlkel intbir Integernesneyi geri dönüştürün . (= "boks")

Kodda:

// starting point
Double myDouble = Double.valueOf(10.0);

// step 1: unboxing
double dbl = myDouble.doubleValue();

// step 2: casting
int intgr = (int) dbl;

// step 3: boxing
Integer val = Integer.valueOf(intgr);

Aslında bir kısayol var. Derhal Doublebir ilkelden bir ilkeye kutudan çıkabilirsiniz int. Bu şekilde, 2. adımı tamamen atlayabilirsiniz.

Double myDouble = Double.valueOf(10.0);
Integer val = Integer.valueOf(myDouble.intValue()); // the simple way

tuzaklar:

Ancak, yukarıdaki kodda yer almayan birçok şey var. Yukarıdaki kod null için güvenli değildir.

Double myDouble = null;
Integer val = Integer.valueOf(myDouble.intValue()); // will throw a NullPointerException

// a null-safe solution:
Integer val = (myDouble == null)? null : Integer.valueOf(myDouble.intValue());

Şimdi çoğu değer için iyi çalışıyor. Ancak tamsayılar a ile karşılaştırıldığında çok küçük bir aralığa (min / maks değer) sahiptir Double. Bunun da ötesinde, çiftler "özel değerler" tutabilir, tamsayılar şunları yapamaz:

  • 1/0 = + sonsuz
  • -1/0 =-sonsuzluk
  • 0/0 = tanımsız (NaN)

Yani, uygulamaya bağlı olarak, kötü İstisnalar önlemek için bazı filtreleme eklemek isteyebilirsiniz.

Sonra bir sonraki eksiklik yuvarlama stratejisidir. Varsayılan olarak Java her zaman aşağı yuvarlanır. Yuvarlama tüm programlama dillerinde mükemmel bir anlam ifade eder. Temelde Java sadece bazı baytları atıyor. Finansal uygulamalarda kesinlikle yarım yukarı yuvarlamayı kullanmak isteyeceksiniz (örneğin: round(0.5) = 1ve round(0.4) = 0).

// null-safe and with better rounding
long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = Integer.valueOf(rounded);

Otomatik (me) boks

Bunda otomatik- (un) boks kullanmak cazip olabilir , ama yapmazdım. Şimdi takılmışsanız, sonraki örnekler de o kadar açık olmayacaktır. Otomatik (un) boksun iç işleyişini anlamıyorsanız, lütfen kullanmayın.

Integer val1 = 10; // works
Integer val2 = 10.0; // doesn't work

Double val3 = 10; // doesn't work
Double val4 = 10.0; // works

Double val5 = null; 
double val6 = val5; // doesn't work (throws a NullPointerException)

Sanırım aşağıdakiler sürpriz olmamalı. Ancak öyleyse, Java'da döküm hakkında bazı makaleleri okumak isteyebilirsiniz.

double val7 = (double) 10; // works
Double val8 = (Double) Integer.valueOf(10); // doesn't work
Integer val9 = (Integer) 9; // pure nonsense

Değeri tercih et:

Ayrıca, yapıcıyı kullanmak için cazip olmayın new Integer()(diğer bazı cevapların önerdiği gibi). valueOf()Onlar önbelleğe alma kullandıkları için yöntemler iyidir. Bu yöntemleri kullanmak iyi bir alışkanlıktır, çünkü zaman zaman size biraz hafıza kazandıracaklardır.

long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = new Integer(rounded); // waste of memory

1
bence bu en iyi cevap
Thor

39

Üç olasılık görüyorum. İlk ikisi basamakları keser, sonuncusu en yakın Tamsayıya yuvarlar.

double d = 9.5;
int i = (int)d;
//i = 9

Double D = 9.5;
int i = Integer.valueOf(D.intValue());
//i = 9

double d = 9.5;
Long L = Math.round(d);
int i = Integer.valueOf(L.intValue());
//i = 10

21
Sonucu bir primitieve int içinde saklayacaksanız, Integer.valueOf öğesine gerek yoktur. Kodunuz Java'yı gereksiz bir kutu ve kutudan çıkarmaya zorlar.
bvdb


23

Gerçekten de, en basit yol kullanmaktır intValue(). Ancak, bu yalnızca tamsayı kısmını döndürür; herhangi bir yuvarlama yapmaz. Tamsayının Çift değerine en yakın olmasını istiyorsanız , bunu yapmanız gerekir:

Integer integer = Integer.valueOf((int) Math.round(myDouble)));

Ve boş durumu unutmayın:

Integer integer = myDouble == null ? null : Integer.valueOf((int) Math.round(myDouble)));

Math.round() sonsuzluk ve NaN gibi garip ördek vakalarını göreceli zarafetle ele alır.


2
Math.round sonucunu int olarak yayınladıysanız neden Integer.valueOf'a ihtiyacınız var?
Eran H.

@EranH .: Java 1.5'ten itibaren, muhtemelen yapmazsınız - otomatik kutulama, kodun aynı şekilde her iki şekilde de sonuçlandığı anlamına gelir. Ama bu kodu henüz nesneleri ve ilkelleri tam olarak kavramayan insanlar için daha net olduğunu düşünüyorum.
Michael Scheper

Kim bu cevabı aşağı oyladı: Nedenini açıklarsanız topluluğa çok daha fazla yardım edersiniz ve bunun sizin için neden işe yaramadığını bulmanıza bile yardımcı olabilir. Açıklamasız aşağı oylama, OTOH, herkes için yararsızdır ve korkakça ortaya çıkar.
Michael Scheper

14
double a = 13.34;
int b = (int) a;

System.out.println(b); //prints 13

2
Soru özellikle sarıcı sınıflar hakkındaydı. Bu cevap ilkellerle ilgilidir.
Michael Scheper

8

Sadece bu şekilde yapın ...

Double d = 13.5578;
int i = d.intValue();
System.out.println(i);

7
Double d = 100.00;
Integer i = d.intValue();

Ayrıca, otomatik boks ile çalıştığını da eklemelisiniz.

Aksi takdirde, bir int (ilkel) alırsınız ve oradan bir Tamsayı alabilirsiniz:

Integer i = new Integer(d.intValue());

2
Bunun new Integer(int)yerine, bunun Integer.valueOf(int)gibi küçük tamsayılar için önbellek içeren kullanmayın .
bvdb


4

Bunu "Daralma veya Açık tür dönüştürme", çift → uzun → int kullanarak yapabilirsiniz. Umarım işe yarar.

double d = 100.04;
long l = (long)d; // Explicit type casting required
int i = (int)l;    // Explicit type casting required

Not: Çiftin tüm ondalık değerlere sahip olduğu ve sol tarafta hiçbir şey olmadığı için 0 verecektir. 0.58 olması durumunda, onu 0'a daraltacaktır. Ancak diğerleri için sihri yapacak.


4

Bunu dene

double doubleValue = 6.5;Double doubleObj = new Double(doubleValue);int intResult = doubleObj.intValue();

3

Double ve Integer, sırasıyla double ve int için Java ilkelleri için sarma sınıflarıdır. Bunlar arasında döküm yapabilirsiniz, ancak kayan noktayı kaybedeceksiniz. Yani, bir int için dökülen 5.4 5 olacaktır. Eğer geri atarsanız, 5.0 olacaktır.


0

Double'in intValue yöntemini kullanmanız yeterlidir

Double initialValue = 7.12;
int finalValue = initialValue.intValue();

2
Diğer cevapların tekrarı gibi görünüyor.
Pang

0

doubleNumber.intValue();Yöntemi kullanın .


2
Diğer cevapların tekrarı gibi görünüyor.
Pang

-1

Halihazırda oluşturulmuş olan Double örneğini paylaşacağı için bellek verimli.

Double.valueOf(Math.floor(54644546464/60*60*24*365)).intValue()

bunun için bir sebep var Math.floor(...)mı? intValue()her zaman zaten kat.
bvdb

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.