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)?
Odpowiedz
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;
Prawidłowe i zwięzłe. – nsantorello
Dobra odpowiedź. Próbowałem również Decimal.Divide (a, b), który dał taki sam wynik. – Baxter
działa jak urok! – Bhimbim
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
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.
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
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();
}
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:
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).
Nic w Twojej odpowiedzi nie służy do udzielenia odpowiedzi na oryginalne pytanie – LordWilmore
- 1. Dlaczego int * [] zanika w int **, ale nie int [] []?
- 2. Dlaczego funkcja! Int() nie działa poprawnie?
- 3. Scala: dlaczego nie działa lista [=> Int]?
- 4. Swift inkrement Int! nie działa
- 5. Dlaczego Int nie dziedziczy/nie rozszerza się z zamówionego [Int]
- 6. Dlaczego działa funkcja (boolean^int> 0)?
- 7. Int64 nie działa podczas Int działa
- 8. Dlaczego 0XAA jest niepodpisaną int, a nie int?
- 9. Różnica między int i deklaracją int int
- 10. SA1125: dlaczego egzekwować "int?" w przeciwieństwie do "Nullable <int>", ale nie w "typeof()"?
- 11. problem z Joda nowy DateTime (int, int, int, int, int, int)
- 12. Dlaczego ten rzut z krótkiej na int nie działa?
- 13. Kiedy int nie jest int (intX_t)
- 14. Python 2.7 i 3.3.2, dlaczego int ("0.0") nie działa?
- 15. Dlaczego int = int * double daje błąd, a int * = double nie (w Javie)?
- 16. int ** vs int [ROWS] [COLS]
- 17. setItemChecked (pozycja int, wartość logiczna) nie działa?
- 18. Konwersja int int *, a następnie z powrotem do int
- 19. Konwersja int ** do const int **
- 20. Wyjaśnienie int? vs int
- 21. Jak działa ObservableCollection <T> .Move (int, int)?
- 22. Dlaczego Array.Length int, a nie uint
- 23. Dlaczego DateTime.Now.Year int i nie ushort
- 24. dlaczego null.asInstanceOf [Int] nie rzuca wyjątku NullPointerException?
- 25. Dlaczego Java 8 wprowadzać * Integer.sum (int a, int b) *
- 26. int a = (int) ((0,7 + 0,1) * 10). Dlaczego a = 7?
- 27. Dlaczego std :: result_of <int(int)> :: type valid?
- 28. php przekształcanie formatowane int int
- 29. Jak przekonwertować int * na int
- 30. WCF nie zwróci int
Czy możesz podać konkretny przykład? Decimal to inny typ niż Int32. – Groo
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