2012-02-15 15 views

Odpowiedz

31

Tutaj pracujesz z liczbami całkowitymi. Spróbuj użyć liczb dziesiętnych dla wszystkich liczb w swoich obliczeniach.

decimal share = (18m/58m)*100m; 
+0

Nie jest z natury jasne, dlaczego literał "18" jest wkompilowany w liczbę całkowitą. Aby wyjaśnić, zgodnie ze specyfikacją językową (struktura leksykalna> tokeny> literały), każdy literał zapisany za pomocą "cyfr dziesiętnych" od 0 do 9 to [Liczba liter całkowitych] (https://msdn.microsoft.com/en-us/library/aa664674 (v = vs.71) .aspx), który kompiluje się w "pierwszy z tych typów, w którym może być reprezentowana jego wartość:' int', 'uint',' long', 'ulong'.", po dodaniu " m "przyrostek literału jest teraz postrzegany jako [Prawdziwa literatura] (https://msdn.microsoft.com/en-us/library/aa691085 (v = vs.71) .aspx), który kompiluje się jako typ" dziesiętny ". – Quantic

+0

Przykład: 'var check = (1/(dziesiętna) 7) * 100 = 14.285714' rzucenie mianownika na dziesiętną rozwiąże problem. – Vijayaraghavan

20

18/58 jest podział całkowitą, co skutkuje 0.

Jeśli chcesz podział dziesiętny, trzeba Aby użyć literału dziesiętnego:

decimal share = (18m/58m) * 100m; 
+2

Cóż, to dla mnie nowość, po prostu podążałem za kalkulatorem. –

3

Ponieważ liczby są liczbami całkowitymi i wykonujesz podział liczb całkowitych.

18/58 to 0 w części całkowitej.

7

Ponieważ niektóre osoby łączą się z tym z praktycznie dowolnego wątku, w którym wynik obliczenia wynosi 0, dodaję to jako rozwiązanie, ponieważ nie wszystkie inne odpowiedzi dotyczą scenariuszy przypadku.

Pojęcie potrzeby wykonywania obliczeń na różnych typach w celu uzyskania tego typu w wyniku ma zastosowanie, jednak powyżej pokazuje tylko "dziesiętny" i używa jego krótkiej formy, takiej jak 18m jako jednej ze zmiennych, które mają zostać obliczone.

// declare and define initial variables. 
int x = 0; 
int y = 100; 

// set the value of 'x'  
x = 44; 

// Results in 0 as the whole number 44 over the whole number 100 is a 
// fraction less than 1, and thus is 0. 
Console.WriteLine((x/y).ToString()); 

// Results in 0 as the whole number 44 over the whole number 100 is a 
// fraction less than 1, and thus is 0. The conversion to double happens 
// after the calculation has been completed, so technically this results 
// in 0.0 
Console.WriteLine(((double)(x/y)).ToString()); 

// Results in 0.44 as the variables are cast prior to calculating 
// into double which allows for fractions less than 1. 
Console.WriteLine(((double)x/(double)y).ToString()); 
1

Ilekroć spotykamy takie sytuacje, po prostu uskok liczniku.

double x = 12.0/23409; 
decimal y = 12m/24309; 

Console.WriteLine($"x = {x} y = {y}");