2009-08-28 15 views
80

Potrzebuję uzyskać wartość liczby całkowitej po lewej stronie od dziesiętnej lub podwójnej. Dla Ex: muszę uzyskać wartość 4 z 4.6. Próbowałem użyć funkcji Math.Floor, ale zwracała podwójną wartość, np. Zwracała 4.0 z 4.6. Dokumentacja MSDN mówi, że zwraca wartość całkowitą. Czy coś mi umyka? Czy istnieje inny sposób osiągnięcia tego, czego szukam? Dziękuję Ci.Dlaczego Math.Floor (Double) zwraca wartość typu Double?

+1

_W dokumentacji MSDN jest napisane, że zwraca ona wartość całkowitą_. [Dokumentacja MSDN] (http://msdn.microsoft.com/en-us/library/e0b5f0xb (v = vs.110) .aspx) stwierdza, że ​​Math.Floor zwraca System.Double, a nie integer. – broadband

+0

Liczba całkowita *** *** jest efektywnie potrzebna, ale nie oznacza, że ​​może być przechowywana w "int" lub "long"."Podwójny" z powodzeniem przechowuje wszystkie wartości całkowite w znacznie szerszym zakresie niż tylko "int" Należy zauważyć, że niektóre wartości całkowite mogą być zaokrąglone, gdy część mantysy ma niewystarczającą liczbę bitów do zapisania wszystkich cyfr wartości całkowitej, gdy jej baza-2 wykładnik idzie powyżej 52: to zaokrąglenie wartości całkowitych w "podwójnym" może wystąpić dla liczb całkowitych powyżej 2^52 lub poniżej -2^52, ale wynik będzie nadal najbliższą liczbą całkowitą reprezentowalną; jeśli używasz "(long) Floor (x)", konwersja może być w dużej mierze błędna. –

+0

Należy jednak zauważyć, że poprawny zakres wartości całkowitych, które mogą być reprezentowane w "podwójnym" jest wyjątkowo duży, z wartościami bezwzględnymi do: (1 + (1 - 2^-52)) × 2^1023 ≈ 1,7976931348623157E308; jest znacznie więcej niż 2^63-1 z "długim". Jednak zakres liczb całkowitych, które mogą być wszystkie przechowywane wyraźnie jest bardziej ograniczony, ponieważ "podwójne" ma tylko 52 bity dla mantysy (plus 1 bit implikowany dla najbardziej znaczącego bitu, nie zapisany), co oznacza, że ​​"podwójne" może przechowywać tylko liczby całkowite dokładnie oonly, gdy ich wartość bezwzględna jest mniejsza od 2^53. –

Odpowiedz

111

Zakres double jest znacznie szerszy niż zakres int lub . Rozważmy następujący kod:

double d = 100000000000000000000d; 
long x = Math.Floor(d); // Invalid in reality 

Liczba całkowita jest poza zakresem long - więc czego można się spodziewać się zdarzyć?

Zazwyczaj wiesz, że wartość będzie faktycznie mieścić się w przedziale od int lub long, więc go obsada:

double d = 1000.1234d; 
int x = (int) Math.Floor(d); 

ale spoczywa na tej obsady jest deweloperem, a nie na samej Math.Floor . Byłoby niepotrzebnie restrykcyjne, aby sprawić, że po prostu zawiedzie z wyjątkiem wszystkich wartości spoza zakresu long.

+0

double jest szerszy niż zakres double? Myślisz, że masz na myśli długo. :) –

+1

Piętro zwraca całkowitą reprezentację podwójną, i zwraca dwukrotnie dla naukowych obliczeń, ta odpowiedź jest nieprawidłowa, ponieważ podwójne ma 64 bity i długie ma również 64 bity, ale podwójne nie może przechowywać dokładnych cyfr niższych znaczących bitów, nawet jeśli może być prawidłowo przechowywany długo. –

+1

@Jon: jak to się stało, że nie ważysz debaty nad tym, jak zrobić pozytywną liczbę ujemną w C# ?: http://stackoverflow.com/questions/1348080/convert-a-positive-number-to- negatywny in-c – MusiGenesis

10

Zgodnie z MSDN, Math.floor (podwójne) zwraca podwójne: http://msdn.microsoft.com/en-us/library/e0b5f0xb.aspx

Jeśli chcesz go jako int:

int result = (int)Math.Floor(yourVariable); 

widzę, jak artykuł MSDN mogą być mylące, oni powinien określić, że podczas gdy wynikiem jest "liczba całkowita" (w tym przypadku oznacza liczbę całkowitą) nadal jest TYPE Podwójnie

+0

Dziękuję za odpowiedź. Właściwie patrzyłem na ten artykuł: http://msdn.microsoft.com/en-us/library/e0b5f0xb.aspx Ale i tak spróbuję twojej sugestii. Dziękuję Ci. –

+0

To prawda, mówi z góry "zwraca liczbę całkowitą", ale typ jest określony poniżej: public static double Floor (double d) –

+3

integer! = 'Int' (http://www.answers.com/integer) - liczby całkowite * mogą * być przechowywane w 'Double' (patrz odpowiedź Jona), i istnieje nieskończona liczba liczb całkowitych, które nie mogą być przechowywane w' int'. – Shog9

0

Podłoga pozostawia ją jako podwójną, dzięki czemu można z nią wykonać więcej podwójnych obliczeń. Jeśli chcesz to jako int, rzuć wynik piętra jako int. Nie należy rzutować oryginalnego podwójnego jako int, ponieważ reguły dla podłogi są różne (IIRC) dla liczb ujemnych.

4

Jeśli potrzebujesz tylko części całkowitej liczby, odrzuć numer do int. Spowoduje to obcięcie liczby w przecinku dziesiętnym.

double myDouble = 4.6; 
int myInteger = (int)myDouble;
+1

Ważne, aby pamiętać, że rzutowanie na 'int' zachowuje się inaczej niż' Piętro', dla liczb ujemnych. 'Piętro' zawsze będzie obcięte do najbardziej ujemnej liczby, podczas gdy rzutowanie na' int' zostanie obcięte w kierunku 0. – Magnus

0
Convert.ToInt32(Math.Floor(Convert.ToDouble(value))) 

To daje dokładną wartość co chcesz jak jeśli wziąć 4.6 powraca 4 jako wyjście.

Powiązane problemy