Come potrei convertire un doppio al valore intero più vicino?


147

Come si converte un doppio nell'int più vicino?

Risposte:


78

Utilizzare Math.round(), possibilmente in combinazione conMidpointRounding.AwayFromZero

per esempio:

Math.Round(1.2) ==> 1
Math.Round(1.5) ==> 2
Math.Round(2.5) ==> 2
Math.Round(2.5, MidpointRounding.AwayFromZero) ==> 3

6
Non Convert.ToInt32()farà la stessa cosa o spoglia semplicemente tutto dopo il decimale?
The Muffin Man,

208
In realtà non produce un numero intero, ma un doppio.
Gatopeich,

13
@Ronnie - no, questo è design. Per impostazione predefinita, Math.Round arrotonderà i numeri dei punti medi (x + .5) al numero pari più vicino . Se si desidera un comportamento diverso, è necessario specificarlo tramite un flag. msdn.microsoft.com/en-us/library/system.midpointrounding.aspx
nickf

6
Beh io mai! :)
Ronnie,

5
Il doppio non è Int.
Evgeni Nabokov,

267
double d = 1.234;
int i = Convert.ToInt32(d);

Riferimento

Gestisce l'arrotondamento in questo modo:

arrotondato all'intero con segno a 32 bit più vicino. Se il valore è a metà strada tra due numeri interi, viene restituito il numero pari; cioè 4.5 viene convertito in 4 e 5.5 viene convertito in 6.


7
Molto meglio che Math.Roundrestituisce un int come richiesto.
Keith,

10
@ robert-Koritnik. Non sono sicuro del perché sia ​​"non valido". OP non ha specificato una regola di arrotondamento preferita, e "arrotondare .5 al più vicino pari" è la regola standard dal passato. L'arrotondamento ha sempre effetti statistici indesiderati.
Keith,

@Keith: non lo so, ma mi è sempre stato insegnato a arrotondare x.5 in su ma posso vedere il ragionamento per farlo su o giù per le statistiche. Grazie per quello PS È chiaro che non sono in statistica, finanza o contabilità dove questo tipo di arrotondamento sembra essere predefinito .
Robert Koritnik,

3
"L'arrotondamento ha sempre effetti statistici indesiderati" - È semplicemente falso. Arrotondamento .5 per eccesso arrotonda esattamente la metà dei numeri [0,.5)- in basso e esattamente la metà dei numeri - [.5,1)- in alto. L'arrotondamento per inclinare anche leggermente i numeri pari, in quanto arrotonda (.5,1.5)a 1 ma [1.5,2.5]a 2.
Jim Balter,

11
@JimBalter Dato che lo zero non è arrotondato, l'arrotondamento per metà in su introduce un bias positivo, quindi è noto come arrotondamento asimmetrico. La "metà arrotondata a pari" non lo è, se la distribuzione è abbastanza uniforme e l'arrotondamento non distorce i numeri pari o dispari. Vedi arrotondamenti a metà strada .
sdds,

36

Puoi anche usare la funzione:

//Works with negative numbers now
static int MyRound(double d) {
  if (d < 0) {
    return (int)(d - 0.5);
  }
  return (int)(d + 0.5);
}

A seconda dell'architettura è più volte più veloce.


Questo è stato perfetto per me dato che Math.Round non funzionava come volevo.
Hanna,

@cullub sì. Converte la doppia d che era stata aggiunta 0,5 in un numero intero.
Darrell,

Questo è il mio metodo preferito - funziona in modo molto semplice. Molto più breve e più facile da leggere rispetto a Math.Round (d, MidpointRounding.AwayFromZero) e più conciso rispetto all'utilizzo di un'istruzione if per scegliere se arrotondare per eccesso o per eccesso. E, in realtà restituisce un intero, alla fine, non una doppia
binderbound

3
Vedi il commento di @Eternal21 di seguito per comportamenti strani sui numeri negativi (MyRound (-1.2) = 0)
Chris

2
Per chiunque si chieda, il problema menzionato da @Chris è ora presumibilmente risolto controllando se il valore è negativo.
John Weisz,

14
double d;
int rounded = (int)Math.Round(d);

5

So che questa domanda è vecchia, ma mi sono imbattuto nella mia ricerca della risposta alla mia domanda simile. Ho pensato di condividere il consiglio molto utile che mi è stato dato.

Quando si converte in int, aggiungere semplicemente .5al proprio valore prima di effettuare il downcast. Dato che il downcast intscende sempre al numero più basso (ad es. (int)1.7 == 1), Se il tuo numero è .5o più alto, l'aggiunta .5lo porterà al numero successivo e il tuo downcast intdovrebbe restituire il valore corretto. (ad es. (int)(1.8 + .5) == 2)


13
Il problema è se provi a convertire valori negativi in ​​quel modo. Ad esempio -1,25 finirà per essere uguale a 0. (-1,25 + 0,5 = 0,75 e una volta lanciato verso il basso è 0). Quindi è necessario sottrarre 0,5 da valori negativi.
Eterno

Si può usare+ 0.5 * Math.Abs(d)
TaW


-1

Per Unity, utilizzare Mathf.RoundToInt .

using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    void Start()
    {
        // Prints 10
        Debug.Log(Mathf.RoundToInt(10.0f));
        // Prints 10
        Debug.Log(Mathf.RoundToInt(10.2f));
        // Prints 11
        Debug.Log(Mathf.RoundToInt(10.7f));
        // Prints 10
        Debug.Log(Mathf.RoundToInt(10.5f));
        // Prints 12
        Debug.Log(Mathf.RoundToInt(11.5f));

        // Prints -10
        Debug.Log(Mathf.RoundToInt(-10.0f));
        // Prints -10
        Debug.Log(Mathf.RoundToInt(-10.2f));
        // Prints -11
        Debug.Log(Mathf.RoundToInt(-10.7f));
        // Prints -10
        Debug.Log(Mathf.RoundToInt(-10.5f));
        // Prints -12
        Debug.Log(Mathf.RoundToInt(-11.5f));
    }
}

fonte

public static int RoundToInt(float f) { return (int)Math.Round(f); }

Q non menziona né contrassegna Unity.
XenoRo,

@XenoRo Stavo rispondendo a questa vecchia domanda per coloro che cercano risposte simili quando si utilizza Unity.
zwcloud,

2
Puoi rispondere alle tue domande per la condivisione delle conoscenze. Crea una domanda separata specifica per l'API (in questo caso Unity) in casi come questo. Le risposte dovrebbero essere utili alle domande. Altrimenti potrebbe esserci una risposta qui per ogni singola API C # con una funzione di arrotondamento.
XenoRo

-2

Sto sviluppando un calcolatore scientifico che sfoggia un pulsante Int. Ho trovato la seguente è una soluzione semplice e affidabile:

double dblInteger;
if( dblNumber < 0 )
   dblInteger = Math.Ceiling(dblNumber);
else
   dblInteger = Math.Floor(dblNumber);

Math.Round a volte produce risultati imprevisti o indesiderati e la conversione esplicita in numero intero (tramite cast o Convert.ToInt ...) spesso produce valori errati per numeri di precisione più elevata. Il metodo sopra sembra funzionare sempre.


2
questo non completa tutti i numeri negativi e tutti i numeri positivi? Questo non è necessariamente il numero intero "più vicino".
Tim Pohlmann,

questo non è il numero più vicino.
Samer Aamar,

1
Dato 1.99, questo restituisce 1.0.
Jon Schneider,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.