2012-08-15 15 views
14

To może być proste rozwiązanie, ale nie mogę go naprawić.Float jest 0 po całkowitym podziałem

jestem podzielenie 2 liczby całkowite:

finishedGameFinalScore = [score integerValue]; 
CGFloat interval = 2/finishedGameFinalScore; 
NSLog(@"interval = %f",interval); 

Dziennik zwraca 0.000000

Czy istnieje limit miejsc po przecinku? Muszę zachować wynik dziesiętny.

Dzięki Shani

+1

'CGFloat finishedGameFinalScore = [bramkę floatValue];' CGFloat interwał = 2.0f/finishedGameFinalScore; ' – janusbalatbat

+1

trzeba podzielić przez liczbę pływającej wskaźnik, aby uzyskać liczbę zmiennoprzecinkową. – Joe

+1

Dotyczy to każdego języka opartego na języku C. Dzielenie dwóch int powoduje int. – borrrden

Odpowiedz

71

Powodem Twój kod nie działa jest to, że jesteś, dzieląc liczbę całkowitą przez inną liczbę całkowitą, a następnie rzucając wynik do pływaka.

Masz więc 2 (liczba całkowita) i pewną inną liczbę (także liczbę całkowitą). Następnie należy podzielić przez 2 tej liczby - co jest prawdopodobnie większy niż 2. Powiedzmy to 3.

Integer widzi 2/3 a on jakby „0,66666667 Pshh, nikt nie potrzebuje niczego po kropce dziesiętnej Anyway?”. Więc ją ścina. Po prostu masz 0.

następnie Integer podaje numer Panu float, a Pan float jest super szczęśliwy, że dostał numer! On jest jak "yay, a 0! Zamierzam dodać WSZYSTKIE ZNACZĄCE CYFRY". I tak kończy się z 0,0000000.

Więc tak, po prostu rzuć na packa. A może nawet podwójne!

enter image description here

+0

Nawet po prostu wykonaj 'CGFloat interval = 2.0/finishedGameFinalScore;' (add ".0"). Jako '2.0' jest 'CGFloat', wynikiem będzie' CGFloat' zachowując wszystkie dziesiętne. –

12

@Dustin powiedział u będzie musiał typecast swoją wartość dzielnik unosić jak to jest w pływak pokazuje wartość całkowitą

Przypadek 1: typecast

NSString *score = @"3"; 
int interval = [str intValue]; 
CGFloat interval = (2/(float)interval); 
NSLog(@"interval = %.2f",interval); 

Przypadek 2: Nie potrzeba typecast

NSString *score = @"3"; 
float interval = [str floatValue]; 
CGFloat interval = (2/interval); 
NSLog(@"interval = %.2f",interval); 
8

Wystarczy dodać f-podpowiedź do numeru 2. W tym przypadku, że załatwi.

CGFloat interval = 2.0f/finishedGameFinalScore; 

wszystkie powyższe/poniższe odpowiedzi są poprawne iw pełni wyjaśniają, dlaczego to działa.

+0

Zwykle nie dodaje się tego jako nowej odpowiedzi, jeśli istnieją już dwie odpowiedzi, o ile nie doda istotnych ważnych danych. Możesz go skomentować w odpowiedzi na pytanie lub inną odpowiedź, jeśli uważasz, że to naprawdę coś dodaje. Ale daję +1, ponieważ jesteś nowy. – Dustin

0

po prostu dodaj długą wartość z 1,0 i przypisz do zmiennej zmiennoprzecinkowej.

unsigned long l1 = 65536; 
unsigned long l2 = 256; 
float f = (l1/1.0)/(l2/1.0); 

NSLog(@"%f",f); 
Powiązane problemy