2009-08-28 31 views
80

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?

+1

_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

+0

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. –

+0

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. –

risposta

111

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.

+0

double è più largo del range del doppio? Pensa che volevi dire a lungo. :) –

+1

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. –

+1

@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

10

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

+0

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. –

+0

È vero, in alto "restituisce un numero intero" ma sotto viene specificato il tipo: public static double Floor (double d) –

+3

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

0

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.

4

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;
+1

È 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

0
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.

Problemi correlati