Java'da tamsayıyı float'a nasıl dönüştürebilirim?


82

İki tam sayım var xve y. Hesaplamam gerekiyor x/yve sonuç olarak float almak istiyorum. Örneğin bir sonucu olarak 3/21.5'e sahip olmak istiyorum. Ben en kolay (veya tek) yolu dönüştürmek yapmanın düşündük xve yşamandıra türü içine. Maalesef bunu yapmanın kolay bir yolunu bulamıyorum. Bana yardım eder misin lütfen?


8
float sonucu = ((float) x) / y?
mibollma



1
@VinAy: Bu durumda bunu tavsiye etmem. BigDecimalevrensel olarak doğru bir ikame değildir float.
Matt Ball

1
@VinAy: Bu tamamen amacın ne olduğuna bağlı. Finans yapıyorsa, haklısınız. Asteroit yörüngelerini hesaplıyorsa, sen değilsin.
user207421

Yanıtlar:


153

İşlenenlerden en az birini bir float'a çevirmeniz yeterlidir :

float z = (float) x / y;

veya

float z = x / (float) y;

veya (gereksiz)

float z = (float) x / (float) y;

Bu, şundan daha mı etkilidir: float z = (1.0 * x) / y; ? Float dönüştürme dahili olarak çarpmadan daha mı verimli? Tnx!
MSquare

1
Bilmiyorum ama bence çoğu zaman% 99 veya daha fazla alakasız. Uzaktan bile bir darboğaz olmayacak. Gerçekten bu kadar endişeliyseniz, kendiniz kıyaslayın.
Matt Ball

1
Birincisi ve ikincisi, belirli kol cihazlarında hatalara neden olur, her iki tamsayı da attığınızdan emin olun.
Oliver Dixon

java.lang.Integer, java.lang.Float
asp

2
@ user3002853, kutulu türler ve ilkeller hakkında bilgi edinin. docs.oracle.com/javase/tutorial/java/data/autoboxing.html
Matt Ball

5

Mecbur kalmadıkça float kullanmamalısınız. Vakaların% 99'unda iki kat daha iyi bir seçimdir.

int x = 1111111111;
int y = 10000;
float f = (float) x / y;
double d = (double) x / y;
System.out.println("f= "+f);
System.out.println("d= "+d);

baskılar

f= 111111.12
d= 111111.1111

@ Matt'in yorumu takip ediliyor.

float çok az hassasiyete sahiptir (6-7 basamak) ve oldukça kolay bir şekilde önemli yuvarlama hatası gösterir. double, başka bir 9 basamak doğruluğa sahiptir. Yüzdürme yerine double kullanmanın maliyeti vakaların% 99'unda kavramsal değildir, ancak yuvarlama hatasından kaynaklanan ince bir hatanın maliyeti çok daha yüksektir. Bu nedenle, birçok geliştirici kayan noktayı hiç kullanmamayı önerir ve BigDecimal'i şiddetle tavsiye eder.

Bununla birlikte, makul yuvarlamanın kullanılması koşuluyla , çoğu durumda çiftin kullanılabileceğini buldum .

Bu durumda, int x'in 32-bitlik bir kesinliği varken float'ın 24-bitlik bir kesinliği vardır, 1'e bölmek bile bir yuvarlama hatasına neden olabilir. double öte yandan 53-bit hassasiyete sahiptir ve bu da makul derecede doğru bir sonuç almak için fazlasıyla yeterlidir.


6
Sen üzerinde durmak gerektiğini neden double daha iyidir float.
Matt Ball

5

Daha fazla hesaplamaya dahil olmadan önce ilk değeri float olarak aktarmanız yeterlidir:

float z = x * 1.0 / y;

4

// Dönüştürmek istediğim tam sayı

int myInt = 100;

// float için tamsayının çevrilmesi

float newFloat = (float) myInt

1
En azından Android Studio'da, derleyici bunu yapmaya çalışan uyumsuz türlerden şikayet edecektir.
Adam R. Turner

3

İşte bunu nasıl yapabileceğiniz:

public static void main(String[] args) {
    // TODO Auto-generated method stub
    int x = 3;
    int y = 2;
    Float fX = new Float(x);
    float res = fX.floatValue()/y;
    System.out.println("res = "+res);
}

Görüşürüz !


7
Bunun için bir sarmalayıcı türünün ( Float) kullanılması tamamen gereksizdir.
Matt Ball

1
Lütfen yazılarınızda imza veya slogan kullanmayın .
meagar

1

Sameer:

float l = new Float(x/y)

önce x ve y'nin tamsayı bölmesini hesaplayacağı ve sonra ondan bir kayan nokta oluşturacağı için çalışmayacaktır.

float result = (float) x / (float) y;

Anlamsal olarak en iyi adaydır.


Cevabınız bir yorum olmalıydı. Sameer, yayınınızla ilgili herhangi bir bildirim almayacak. Anlamsal olarak, sonucu hesaplamadan önce her iki girişi de kayan noktaya dönüştürmek gereksizdir - bu nedenle, yalnızca birini dönüştürmekten daha iyi değildir. Yanlış bir izlenim verir ve bu nedenle aşağılıktır, imho.
kullanıcı bilinmiyor
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.