Bir int (java) dönüştürmek için bir ikiye katlama


120

Şu anda bunu deniyorum:

int a = round(n);

nerede na doubleama çalışmıyor. Neyi yanlış yapıyorum?



6
"Çalışmama" yı gerçekten daha ayrıntılı olarak açıklamalısınız. Ne oluyor? Ne olmaz? Ne bekliyordun? Ne tür hatalar aldınız? round()Aynı sınıfta bir metodunuz var mı? Yaptın import static java.lang.Math.*mı Vb .. Sayıları yuvarlamanın pek çok yolu vardır ve dolayısıyla birçok olası cevap da vardır. Başka bir deyişle, sorunuz belirsiz ve belirsizdir ve mevcut haliyle makul bir şekilde cevaplanamaz. Karanlıkta çekim yapıyor.
BalusC

1
"Çalışmıyor", en yakın int değerine yuvarlamamak, istisna atmak veya yukarı / aşağı yuvarlamamak anlamına mı geliyor? Bu soru, bağlamı yanıtla çapraz referans almak zorunda kalmadan işe yaramaz.
modulitos

Yanıtlar:


239

Ön round()bilgideki yöntemin dönüş türü nedir ?

Math.round()Yöntem bu ise, giriş parametresi Double olduğunda Long döndürür.

Yani, dönüş değerini atmanız gerekecek:

int a = (int) Math.round(doubleVar);

1
Bir int'e çevrim yapmak yerine Math.toIntExact (long) kullanmayı düşünün; bir dublör oldukça geniş bir değer aralığını tutabilir ve dublörünüz beklediğinizden daha büyükse muhtemelen en önemli bitleri sessizce atmak istemezsiniz.
othp

Oyuncu kadrosunun gerekli olmadığına inanıyorum. Geçmişte olup olmadığının farkında değilim, ancak tur int döndürüyor.
Bırakma

@Dropout Math.round, ona bir float verirseniz bir int, bir double verirseniz uzun bir döndürür.
Tur1ng

27

Math.round () 'dan hoşlanmıyorsanız, bu basit yaklaşımı da kullanabilirsiniz:

int a = (int) (doubleVar + 0.5);

4
Math.round()
Beğenmemek

3
Bu çözüm daha kısadır, içe aktarmaya ihtiyaç duymaz ve minimum değişiklikle diğer birçok programlama diline taşınabilir. Platformunuza bağlı olarak daha da hızlı olabilir: stackoverflow.com/questions/12091014/…
Dr. Daniel Thommes

1
Cevabınızı eleştirmiyorum, bahsettiğiniz nedenle çok faydalı buluyorum . Bu yorumla, kullanmaktan korkacak insanlara hitap ediyordum, Math.round()ki bu "tam anlamıyla" sağladığınız çözümle aynı şeyi yapıyor, hepsi bu. Şerefe.
Gauthier Boaglio

2
Evet, nehz'in dediği gibi, örneğin bunun -2.1'i -1'e yuvarlayacağına inanıyorum.
Ben Aaronson

5
@AlbertoHormazabal, eklediğini fark etmedin 0.5mi?
Sasha

11

Şu şekilde "en yakın" tam sayıya iki kat yuvarlama :

1.4 -> 1

1.6 -> 2

-2.1 -> -2

-1,3 -> -1

-1.5 -> -2

private int round(double d){
    double dAbs = Math.abs(d);
    int i = (int) dAbs;
    double result = dAbs - (double) i;
    if(result<0.5){
        return d<0 ? -i : i;            
    }else{
        return d<0 ? -(i+1) : i+1;          
    }
}

Koşulu (sonuç <0,5) tercihinize göre değiştirebilirsiniz.


Anivaler'in cevabına katılıyorum. Ancak en yüksek tam sayıya yuvarlamanız gerekiyorsa, aşağıdakileri beğenebilirsiniz: double decimalNumber = 4.56777; System.out.println (new Float (Math.round (decimalNumber))); Çıktı: 5
Smeet

3
import java.math.*;
public class TestRound11 {
  public static void main(String args[]){
    double d = 3.1537;
    BigDecimal bd = new BigDecimal(d);
    bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP);
    // output is 3.15
    System.out.println(d + " : " + round(d, 2));
    // output is 3.154
    System.out.println(d + " : " + round(d, 3));
  }

  public static double round(double d, int decimalPlace){
    // see the Javadoc about why we use a String in the constructor
    // http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigDecimal.html#BigDecimal(double)
    BigDecimal bd = new BigDecimal(Double.toString(d));
    bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP);
    return bd.doubleValue();
  }
}

3

Math.round fonksiyonu aşırı yüklendi Bir float değeri aldığında, size bir int verecektir. Örneğin bu işe yarar.

int a=Math.round(1.7f);

Çift değer aldığında, size uzun bir süre verir, bu nedenle int'e döküm yazmanız gerekir.

int a=(int)Math.round(1.7);

Bu, hassasiyet kaybını önlemek için yapılır. İkili değeriniz 64bit, ancak o zaman int değişkeniniz yalnızca 32bit depolayabilir, bu nedenle onu sadece uzun olana dönüştürür, bu 64bittir, ancak yukarıda açıklandığı gibi 32bit'e döküm yazabilirsiniz.


1

Math.roundDiyor ki belgeleri :

Bağımsız değişkeni bir tam sayıya yuvarlamanın sonucunu döndürür . Sonuç eşdeğerdir (int) Math.floor(f+0.5).

Yayınlamaya gerek yok int. Belki geçmişten değiştirilmiştir.


4
2 Math.round yöntemi vardır. Float alan bir tamsayı döndürür, bu doğrudur. Ama çift alan uzun bir geri döner.
Dominik Ehrenberg

0
public static int round(double d) {
    if (d > 0) {
        return (int) (d + 0.5);
    } else {
        return (int) (d - 0.5);
    }
}

-1

Gerçekten daha eksiksiz bir örnek göndermeniz gerekiyor, böylece ne yapmaya çalıştığınızı görebiliriz. Gönderdiklerinize göre, işte görebildiklerim. İlk olarak, yerleşik bir round()yöntem yoktur. Ya aramanız Math.round(n)ya da statik olarak içe aktarmanız Math.roundve ardından sahip olduğunuz gibi çağırmanız gerekir.


Başlangıç ​​olarak, java'da global işlevler yoktur.
Danon
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.