Ho bisogno di ottenere il valore intero del lato sinistro da un decimale o doppio. Ad esempio: ho bisogno di ottenere il valore 4 da 4.6. Ho provato a utilizzare la funzione Math.Floor ma restituisce un valore doppio, ad esempio: restituisce 4.0 da 4.6. La documentazione MSDN dice che restituisce un valore intero. Mi sto perdendo qualcosa qui? O c'è un modo diverso per ottenere quello che sto cercando? Grazie.Perché Math.Floor (Double) restituisce un valore di tipo Double?
risposta
L'intervallo di double
è molto più ampio dell'intervallo di int
o long
. Considerate questo codice:
double d = 100000000000000000000d;
long x = Math.Floor(d); // Invalid in reality
L'intero è al di fuori della gamma di long
- così che cosa ci si può aspettare che accada?
In genere si sa che il valore sarà realtà essere all'interno della gamma di int
o long
, quindi la lanci:
double d = 1000.1234d;
int x = (int) Math.Floor(d);
ma l'onere per questo cast è lo sviluppatore, non su Math.Floor
sé . Sarebbe stato inutilmente restrittivo farlo fallire con un'eccezione per tutti i valori al di fuori dell'intervallo di long
.
double è più largo del range del doppio? Pensa che volevi dire a lungo. :) –
Floor restituisce la rappresentazione intera di double e restituisce double per i calcoli scientifici, questa risposta non è corretta perché double ha 64 bit e lunga ha anche 64 bit, ma double non può memorizzare le cifre esatte di bit significativi più bassi anche se può essere memorizzati correttamente a lungo. –
@Jon: come mai non hai valutato il dibattito infuriato su come rendere un numero positivo negativo in C# ?: http://stackoverflow.com/questions/1348080/convert-a-positive-number-to- negative-in-c – MusiGenesis
Secondo MSDN, Math.floor (doppio) restituisce un doppio: http://msdn.microsoft.com/en-us/library/e0b5f0xb.aspx
Se si vuole come un int:
int result = (int)Math.Floor(yourVariable);
posso vedere come l'articolo di MSDN può essere fuorviante, hanno dovrebbe aver specificato che mentre il risultato è un "intero" (in questo caso significa numero intero) è ancora di TIPO doppio
Grazie per la risposta. In realtà stavo guardando questo articolo: http://msdn.microsoft.com/en-us/library/e0b5f0xb.aspx Ma comunque, proverò il tuo suggerimento. Grazie. –
È vero, in alto "restituisce un numero intero" ma sotto viene specificato il tipo: public static double Floor (double d) –
integer! = 'Int' (http://www.answers.com/integer) - gli interi * possono * essere memorizzati in 'Double' (vedi la risposta di Jon), e ci sono un numero infinito di numeri interi che non possono essere memorizzati in un' int'. – Shog9
Che è corretto. Guardando la dichiarazione, Math.Floor (double) produce un double (vedi http://msdn.microsoft.com/en-us/library/e0b5f0xb.aspx). Suppongo che per "numero intero" intendano "numero intero".
Piano lo lascia come un doppio in modo da poter eseguire più calcoli con esso. Se lo vuoi come int, inserisci il risultato di floor come int. Non eseguire il cast originale come int perché le regole per floor sono diverse (IIRC) per i numeri negativi.
Se è sufficiente la parte intera di un numero, inserire il numero su int
. Questo troncerà il numero al punto decimale.
double myDouble = 4.6;
int myInteger = (int)myDouble;
È importante notare che il lancio su 'int' si comporta diversamente con' Floor', per i numeri negativi. 'Floor' truncerà sempre al numero più negativo, mentre il cast verso' int' troncherà verso 0. – Magnus
Convert.ToInt32(Math.Floor(Convert.ToDouble(value)))
Questo vi darà il valore esatto ciò che si vuole, come se si prende 4.6
restituisce 4
come output.
- 1. Java Double vs double: tipo classe vs tipo primitivo
- 2. Perché int = int * double restituisce un errore e int * = double no (in Java)?
- 3. C#: double [] [] e double [,]
- 4. Inizializzazione Double Brace Tipo Confusion
- 5. Perché non è Math.max (double a, double b) varadic?
- 6. Perché numeric_limits :: min restituisce un valore negativo per int ma valori positivi per float/double?
- 7. Come si converte Double [] in double []?
- 8. Perché la finestra principale di tipo double opzionale?
- 9. perché math.Ceiling (double a) non restituisce direttamente int?
- 10. TryCast to Double?
- 11. why boost :: call_traits <double> :: param_type è "const double &", mentre non "double"
- 12. Java: diversi double e double a confronto
- 13. come implementare pow (double x, double y)?
- 14. double not (!!) contro tipo coercizione in JavaScript
- 15. Impossibile trovare un inizializzatore per il tipo Double in Swift
- 16. Perché C# Math.floor() restituire il doppio, invece di Int
- 17. Double Equals (==) in TypeScript
- 18. Math.Floor vs cast in un tipo integrale in C#
- 19. Perché C++ richiede che il complesso venga istanziato solo per float, double o long double?
- 20. Converti DateTime in Double
- 21. Java: double vs float
- 22. Perché la funzione Double.compare (double, double) di Java è implementata così com'è?
- 23. Perché TimeSpan.FromSeconds (double) round in millisecondi?
- 24. Qualificatore tabella Double Dot
- 25. Complessità di un ciclo double per
- 26. definizione di operatore "==" per Double
- 27. printf e long double
- 28. Portabilità della serializzazione binaria di tipo double/float in C++
- 29. GestureOverlayView e Double-Tap
- 30. double free or corruption
_La documentazione MSDN dice che restituisce un valore intero_. [Documentazione MSDN] (http://msdn.microsoft.com/en-us/library/e0b5f0xb (v = vs.110) .aspx) afferma che Math.Floor restituisce System.Double, non intero. – broadband
Un valore intero *** *** è effettivamente necessario, ma non significa che possa essere memorizzato in "int" o "long".Un "doppio" memorizza correttamente tutti i valori interi in un intervallo molto più ampio rispetto a "int" Nota che alcuni valori interi possono essere arrotondati quando la parte mantissa non ha abbastanza bit per memorizzare tutte le cifre del valore intero, quando la sua base-2 esponente va oltre 52: questo arrotondamento di valori interi in "doppio" può verificarsi per numeri interi superiori a 2^52 o inferiori a -2^52 ma il risultato sarà comunque il numero intero più vicino rappresentabile; se si utilizza "(long) Floor (x)", la conversione potrebbe essere ampiamente sbagliata. –
Si noti tuttavia che l'intervallo valido di vallues interi che possono essere rappresentati in un "doppio" è estremamente ampio, con valori assoluti fino a: (1 + (1 - 2^-52)) × 2^1023 ≈ 1.7976931348623157E308; è molto più di 2^63-1 con "long". Tuttavia, l'intervallo di numeri interi che possono essere memorizzati in modo distinto è più limitato, perché un "doppio" ha solo 52 bit per la mantissa (più 1 bit implicito per il bit più significativo, non memorizzato), il che significa che "double" può memorizzare solo interi esattamente esattamente quando il loro valore assoluto è inferiore a 2^53. –