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?
Odpowiedz
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
.
double jest szerszy niż zakres double? Myślisz, że masz na myśli długo. :) –
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. –
@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
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
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. –
To prawda, mówi z góry "zwraca liczbę całkowitą", ale typ jest określony poniżej: public static double Floor (double d) –
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
To prawda. Patrząc na deklarację, Math.Floor (double) daje podwójne (patrz http://msdn.microsoft.com/en-us/library/e0b5f0xb.aspx). Zakładam, że przez "integer" rozumiemy "liczbę całkowitą".
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.
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;
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
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.
- 1. Dlaczego Math.ceil zwraca double?
- 2. C#: double [] [] i double [,]
- 3. Haskell monada: IO [Double] do [IO Double]
- 4. dlaczego boost :: call_traits <double> :: param_type to "const double &", a nie "double"
- 5. dlaczego math.Ceiling (double a) nie zwraca int bezpośrednio?
- 6. Jak zmusić obiekt listy do typu „double”
- 7. Node.js double console.log output
- 8. Porównanie Double Java
- 9. dlaczego Double.parse Double zarabia 9999999999999999 na 10000000000000000?
- 10. error: funkcja "atomicAdd (double *, double)" została już zdefiniowana
- 11. Czy istnieje znacząca różnica między "Double" i "double" w .Net?
- 12. Co się stanie, jeśli rzucę double do int, ale wartość double jest poza zakresem?
- 13. Double to Const Char *
- 14. Android Double Tap
- 15. Double LEFT DOŁĄCZ
- 16. Double touch on UIButton
- 17. Double ma wiele atrybutów
- 18. Proste: NSArray obiekt do Double?
- 19. Float vs double Math Java
- 20. Dlaczego int = int * double daje błąd, a int * = double nie (w Javie)?
- 21. Qt - Problemy podczas szeregowania "double"
- 22. Math.Floor vs odlewane do typu integralnego w C#
- 23. Int to Double Casting Problem
- 24. Double Checked Locking w Singleton
- 25. Dlaczego mediana potknie się w data.table (integer kontra double)?
- 26. Konwertuj Integer na Double w MIPS
- 27. Jak odczytać kolumny typu double w plikach MDB w węźle?
- 28. Wysyłanie 'NSNumber * __ silny' do parametru niekompatybilnych typu 'CLLocationDegrees' (aka 'double')
- 29. Nieważne operandy typu "double" i "int" dla binarnego "operatora%"
- 30. LUA (Corona SDK) Math.floor() zwraca błędną wartość z przyrostem 0,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
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. –
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. –