2011-04-08 22 views
7

Neden iki tamsayı bölme sonucunu float değişkenine kaydedemeyiz?objektif c şamandıra değerleri

int a = 100; 
int b =50; 
float temp = b/a; 

o t = 0!

da ben t = 0 verir

int temp = b/a; 

yaptı! Ben

float temp = (float)b/(float)a; 

ne zaman

ama doğru sonuç verir. Neden öyle ?

cevap

22

0.5 derleyici İşlenenlerin türlerine dayalı Bölme işleminin çıktı türünü belirler olmasıdır verir 0 float temp = (float)b/a; ise float temp = b/a; verir nedeni değil, hedef depolama türü. Basitçe:

int / int = int 
float/ int = float 
int /float = float 
float/float = float 

Yani float temp = b/a; yaptığınızda b ve a tamsayı ayrımın yapıyor ve sonra tip float bir değişken içine (sizin örnekte 0) çıkan tamsayı depolamak ediyoruz. Özünde, değer kayan noktaya dönüştürüldüğü zaman, aradığınız bilgiyi zaten kaybettiniz (kayan noktalı bir bölme yapmak istediğinizi varsayarak) ve dönüşüm geri getirmeyecektir. Eğer (yine, bir kayan nokta ayrımı yapmak istiyorum varsayılarak) istediğiniz sonucu alabilmek için

, size bölmek önce floatiçin işlenen en az birini döküm gerekir.

+0

Bu derleyici davranışının ardındaki nedenleri bilen var mı? Açıktır ki, tamsayı bölümlerinin tonlarca kombinasyonu tamsayı olmayan bir değerle sonuçlanacak, bu yüzden derleyicinin her durumda bir tamsayı istediğinizi varsayması garip görünüyor. –

3
int a = 100; 
int b =50; 
float temp = (float)b/a; 
+0

Sanırım alacağım. :) –

+0

ya ...: D ...... – Maulik

3

Onun tamsayı bölme - 50/100 Eğer int döküm olsun, Sen yüzen kullanmanız gerekecektir 50

olduğu (modülüne kullanabilirsiniz) veya onlarla başlamak 0, kalan ise kadardır sen.

2

Sizin durumunuzda 50/100, 0.2'dir. İki tam sayı için sonuç elde edildikten sonra, sonuç tamsayı formunda da olacaktır, böylece ondalık parçayı tek başına 0 verir. Ama yüzen bölümü olarak kabul edilir şamandıra durumunda böylece alacak 0.2

+0

ya da temp değişkeni süzülüyor, bu yüzden temp, float değerlerini depolayabiliyorken sonuç neden kesiliyor? – Maulik

+0

Çünkü Objective-C '/' tamsayı argümanları üzerinde tamsayı bölüştürür, böylece 4/5 0'a yuvarlanır, 3/2 1'e yuvarlanır, vb.Büyük olasılıkla bölümlemeden önce bazı sayılarınızı kayan nokta formlarına dökmek isteyebilirsiniz. – visakh7

3

aşağıda deyimi İşlemi bakarak önce şamandıra içine tamsayı değerleri döküm edilir demektir

float temp = (float)b/(float)a; 

Öyleyse

float temp = (float)50/(float)100; 

float temp = 50.0/100.0 ; 

aşağıda görülebilir Ve sonucu

temp = 0.5;