2009-06-25 28 views
80

Jak to jest, dzielenie dwóch 32-bitowych liczb int jako (int/int) wraca do mnie 0, ale jeśli użyję Decimal.Divide() otrzymam poprawną odpowiedź? W żadnym wypadku nie jestem c. Facetem.Dlaczego Decimal.Divide (int, int) działa, ale nie (int/int)?

+1

Czy możesz podać konkretny przykład? Decimal to inny typ niż Int32. – Groo

+0

Przy okazji znalazłem [Decimal.Divide] (https://msdn.microsoft.com/en-us/library/system.decimal.divide%28v=vs.110%29.aspx) zajmuje tylko dziesiętne jako dane wejściowe. – Ravi

Odpowiedz

158

int jest typem całkowitym; dzielenie dwóch int wykonuje całkowitą podział , to znaczy część ułamkowa jest obcięta, ponieważ nie może być zapisana w typie wyniku (również int!). Decimal, przeciwnie, ma część ułamkową. Wywołując Decimal.Divide, twoje argumenty int są niejawnie konwertowane na Decimal s.

Można wymusić podział niecałkowitą na int argumentów jawnie odlewania przynajmniej jeden z argumentów typu zmiennoprzecinkowej, np:

int a = 42; 
int b = 23; 
double result = (double)a/b; 
+2

Prawidłowe i zwięzłe. – nsantorello

+2

Dobra odpowiedź. Próbowałem również Decimal.Divide (a, b), który dał taki sam wynik. – Baxter

+0

działa jak urok! – Bhimbim

0

Jeśli szukasz 0 < < 1 odpowiedź , int/int nie wystarczy. int/int robi podział całkowity. Spróbuj rzucić jedną z int do podwójnej wewnątrz operacji.

+1

Int32 jest liczbą całkowitą ze znakiem, czy miałeś na myśli 0 Groo

+0

Hah tak, dzięki za połów! – Brian

2

Sądzę Decimal.Divide(decimal, decimal) niejawnie konwertuje swoje argumenty int 2 miejsc po przecinku przed powrotem wartość dziesiętną (precyzyjne), gdzie jako 4/5 traktowany jest jako podział liczby całkowitej i zwraca 0

6

W pierwszym przypadku, robisz całkowitą dzielenie, więc wynik jest obcinany (część dziesiętna jest odcinana) i zwracana jest liczba całkowita.

W drugim przypadku wartości liczbowe są najpierw konwertowane na dziesiętne, a wynik jest dziesiętny. Dlatego nie są one przycinane i otrzymujesz poprawny wynik.

3

następujący wiersz:

int a = 1, b = 2; 
object result = a/b; 

... będą wykonywane przy użyciu arytmetyki liczb całkowitych. Decimal.Divide z drugiej strony przyjmuje dwa parametry typu Decimal, więc podział zostanie przeprowadzony na wartościach dziesiętnych zamiast wartościach całkowitych. Jest to równoznaczne z tym:

int a = 1, b = 2; 
object result = (Decimal)a/(Decimal)b; 

Aby to zbadać, można dodać następujące linie kodu po każdym z powyższych przykładów:

Console.WriteLine(result.ToString()); 
Console.WriteLine(result.GetType().ToString()); 

Wyjście W pierwszym przypadku będzie

0 
System.Int32 

..i w drugim przypadku:

0,5 
System.Decimal 
1

Chcesz odrzucić numery:

podwójne c = (podwójne) a/(podwójne) b;

Uwaga: Jeśli którykolwiek z argumentów w C# jest podwójny, używany jest podwójny podział, który powoduje podwójne.Tak więc następujące czynności też będą działać:

podwójne c = (podwójne) a/b;

tutaj to mały program:

static void Main(string[] args) 
     { 
      int a=0, b = 0, c = 0; 
      int n = Convert.ToInt16(Console.ReadLine()); 
      string[] arr_temp = Console.ReadLine().Split(' '); 
      int[] arr = Array.ConvertAll(arr_temp, Int32.Parse); 
      foreach (int i in arr) 
      { 
       if (i > 0) a++; 
       else if (i < 0) b++; 
       else c++; 
      } 
      Console.WriteLine("{0}", (double)a/n); 
      Console.WriteLine("{0}", (double)b/n); 
      Console.WriteLine("{0}", (double)c/n); 
      Console.ReadKey(); 
     } 
-1

Odpowiedź oznaczone jako takie jest prawie tam, ale myślę, że warto dodać, że istnieje różnica pomiędzy użyciem podwójnie i po przecinku.

nie zrobiłbym lepiej wyjaśniający pojęcia niż Wikipedia, więc będę po prostu dostarczyć wskazówek:

floating-point arithmetic

decimal data type

w systemach finansowych, często jest to wymóg, że może zagwarantować pewną liczbę dokładności miejsc dziesiętnych (bazowych 10). Jest to na ogół niemożliwe, jeśli dane wejściowe/źródłowe są w bazie-10, ale wykonujemy arytmetykę w bazie-2 (ponieważ liczba miejsc dziesiętnych wymagana do dziesiętnego rozwinięcia liczby zależy od podstawy, jedna trzecia zajmuje nieskończenie wiele dziesiętnych miejsca do wyrażenia w bazie-10 jako 0.333333 ..., ale zajmuje tylko jeden dziesiętny w bazie-3: 0,1).

Liczby zmiennoprzecinkowe są szybsze do pracy (pod względem czasu procesora, pod względem programowania są równie proste) i preferowane, gdy chcesz zminimalizować błąd zaokrąglania (jak w aplikacjach naukowych).

+0

Nic w Twojej odpowiedzi nie służy do udzielenia odpowiedzi na oryginalne pytanie – LordWilmore

Powiązane problemy