Come si converte un decimale in un intero?Come si converte un numero decimale in un numero intero in C#?
risposta
Usa Convert.ToInt32
da mscorlib
come in
decimal value = 3.14m;
int n = Convert.ToInt32(value);
Vedi MSDN. Puoi anche usare Decimal.ToInt32
. Ancora una volta, vedi MSDN. Infine, puoi eseguire un cast diretto come in
decimal value = 3.14m;
int n = (int) value;
che utilizza l'operatore di cast esplicito. Vedi MSDN.
Attenzione: Convert ha alcuni comportamenti sorprendenti per certe conversioni ('null' vs.' 0' vs. ' ""'). Raccomanderei di non utilizzare mai Converti a meno che non sia assolutamente necessario la sua flessibilità (ad esempio in scenari dinamicamente tipizzati) –
-1 poiché non funzionerà con valori come decimal.MaxValue e decimal.MinValue e restituisce un 'OverflowException'. Credo che @Will fornisca una risposta migliore qui http://stackoverflow.com/a/501165/39532 – mezoid
Fai attenzione, perché 'Convert.ToInt32' e' Decimal.ToInt32' si comportano diversamente. Da MSDN: 'Decimal.ToInt32' - Il valore di ritorno è la parte integrale del valore decimale; le cifre frazionarie sono ** troncate **. 'Convert.ToInt32' - Restituisce il valore ** arrotondato ** al numero intero con segno a 32 bit più vicino. Se il valore è a metà strada tra due numeri interi, viene restituito il numero pari; ovvero, 4.5 viene convertito in 4 e 5.5 viene convertito in 6. – vezucci
System.Decimal
implementa l'interfaccia IConvertable
, che ha un membro ToInt32()
.
Il telefono System.Decimal.ToInt32()
funziona per te?
Da [la documentazione] (https://msdn.microsoft.com/en-us/library/bb350799 (v = vs.110) .aspx) : "Questa API supporta l'infrastruttura .NET Framework e non è progettata per essere utilizzata direttamente dal codice". Perché non utilizzare Convert.ToInt32? –
int i = (int)d;
ti darà il numero arrotondato.
Se si desidera arrotondare al numero pari più vicino (cioè> 0,5 sarà arrotondare) è possibile utilizzare
int i = (int)Math.Round(d, MidpointRounding.ToEven);
In generale si può lanciare tra tutti i tipi numerici in C#. Se non vi sono informazioni che verranno persi durante il lancio si può fare in modo implicito:
int i = 10;
decimal d = i;
anche se è ancora possibile farlo in modo esplicito, se lo si desidera:
int i = 10;
decimal d = (decimal)i;
Tuttavia, se avete intenzione di essere perdita di informazioni attraverso il cast è necessario farlo in modo esplicito (per mostrare siete a conoscenza che si può perdere informazioni):
decimal d = 10.5M;
int i = (int)d;
Qui si stanno perdendo il" .5" . Questo può andar bene, ma devi essere esplicito a riguardo e fare un cast esplicito per mostrare che potresti perdere le informazioni.
Un trucco perfetto per arrotondare rapidamente è aggiungere .5 prima di trasmettere il valore decimale a un valore int.
decimal d = 10.1m;
d += .5m;
int i = (int)d;
lascia ancora i=10
, ma
decimal d = 10.5m;
d += .5m;
int i = (int)d;
Sarebbe arrotondare in modo che i=11
.
Perché preoccuparsi di fare questo quando c'è Math.Floor e Math.Ceiling? – Badaro
All'epoca ero abbastanza nuovo in C# e per qualche motivo non mi ero reso conto che queste funzioni esistevano. In realtà è un trucco che ho imparato da C/C++, dove ovviamente era più utile. – DeadlyBrad42
Cosa succede se il valore decimale era, ad es. -9.3? – supercat
Non è possibile.
Beh, naturalmente è possibile che sia, tuttavia un int (System.Int32) non è abbastanza grande da contenere ogni possibile valore decimale.
Ciò significa che se si esegue un decimale superiore a int.MaxValue si verificherà un overflow e se il valore decimale è inferiore a int.MinValue, sarà inferiore.
Cosa succede quando si sotto/troppo pieno? Una delle due cose. Se la costruzione non è selezionata (vale a dire, il CLR non importa se si fa), l'applicazione continuerà dopo che il valore sopra/underflow, ma il valore nel int non sarà quello che vi aspettavate. Questo può portare a bug intermittenti e potrebbe essere difficile da risolvere. Finirai con la tua applicazione in uno stato sconosciuto che potrebbe portare la tua applicazione a corrompere qualsiasi dato importante su cui sta lavorando. Non bene.
Se l'assembly è selezionato (proprietà-> build-> advanced-> verifica per overflow/underflow aritmetico o l'opzione del compilatore/checked), il codice genererà un'eccezione quando si verifica un under/overflow. Probabilmente è meglio di no; tuttavia, l'impostazione predefinita per gli assembly non è la verifica dell'over/underflow.
la vera domanda è "che cosa stai cercando di fare?" Senza conoscere le vostre esigenze, nessuno può dire che cosa si dovrebbe fare in questo caso, a parte l'ovvio: non fatelo.
Se specificamente non si cura, le risposte qui sono validi. Tuttavia, si dovrebbe comunicare la comprensione che un overflow potrebbe verificarsi e che non importa avvolgendo il codice di fusione in un blocco incontrollato
unchecked
{
// do your conversions that may underflow/overflow here
}
In questo modo le persone che vengono dietro di voi capisce non lo fai cura, e se in futuro qualcuno cambia la costruisce a/controllato, il codice non si rompe inaspettatamente.
Se tutto ciò che si vuole fare è rilasciare la parte frazionaria del numero, lasciando la parte integrale, è possibile utilizzare Math.Truncate.
decimal actual = 10.5M;
decimal expected = 10M;
Assert.AreEqual(expected, Math.Truncate(actual));
Anche se sospetto che siano la stessa cosa sotto il cofano se l'input è un decimale, mi sento più a mio agio usando Decimal.Truncate di Math.Truncate, dal momento che quest'ultimo accetta anche il doppio e quindi può essere compreso per essere in grado di troncare numeri che non sono base 10, al contrario di Decimal.Truncate, che è un vero troncamento di un numero di base 10. – Brian
I contesti non selezionati non si applicano ai decimali; le operazioni su decimali genereranno OverflowExceptions a prescindere. – Dave
@dave Damnit, hai ragione. BRB, ECMA. – Will
Io preferisco usare Math.Round, Math.Floor, Math.Ceiling o Math.Truncate per impostare in modo esplicito la modalità di arrotondamento a seconda dei casi.
Si noti che tutti restituiscono anche Decimal - poiché Decimal ha un intervallo di valori più ampio di un Int32, quindi sarà ancora necessario eseguire il cast (e verificare l'overflow/underflow).
checked {
int i = (int)Math.Floor(d);
}
Trovo che l'operatore di fusione non funziona se si dispone di un numero decimale in scatola (vale a dire un valore decimale all'interno di un tipo di oggetto). Convert.ToInt32 (decimale come oggetto) funziona correttamente in questo caso.
Questa situazione si presenta quando si recuperano i valori IDENTITÀ/autonumber dal database:
SqlCommand foo = new SqlCommand("INSERT INTO...; SELECT SCOPE_IDENTITY()", conn);
int ID = Convert.ToInt32(foo.ExecuteScalar()); // works
int ID = (int)foo.ExecuteScalar(); // throws InvalidCastException
Aggiungendo altro a esso per riferimento: è perché è possibile solo annullare la registrazione allo stesso tipo originale. Qui 'SELECT SCOPE_IDENTITY()' restituisce 'numeric (38, 0)' che si traduce in 'decimal' di .NET. 'foo.ExecuteScalar()' restituisce un 'decimale' in scatola come' oggetto' che non può essere castato direttamente in un 'int'. '(int) (decimale) foo.ExecuteScalar()' o 'Convert.ToInt32 (foo.ExecuteScalar())' funzionerebbe. – rageit
arrotondamento decimale al numero intero più vicino
decimal a ;
int b = (int)(a + 0.5m);
quando a = 49.9
, quindi b = 50
quando a = 49.5
, quindi b = 50
quando a = 49.4
, quindi b = 49
ecc
decimal vIn = 0.0M;
int vOut = Convert.ToInt32(vIn);
Ecco una pagina web tipo di dati convertito molto utile per quelle degli altri. http://www.convertdatatypes.com/Convert-decimal-to-int-in-CSharp.html
- 1. Come si converte un numero intero in un tipo enumerato?
- 2. Numero intero o numero decimale
- 3. Conversione di un numero decimale in un numero misto (base)
- 4. Convertire un numero intero in un numero float in Golang
- 5. Come si converte un riferimento enum in un numero?
- 6. Come si converte un numero positivo in negativo?
- 7. Arrotondare un numero intero al numero intero più vicino
- 8. Come si converte un numero binario in un BigInteger in Java?
- 9. Come si converte un numero in un INTERVALLO di minuti?
- 10. Come rappresentare un numero intero superiore a un numero intero
- 11. Come si converte un carattere in numero intero in una funzione di PostgreSQL (9.1)?
- 12. Come limitare un numero decimale?
- 13. Converte una stringa in intero con decimale in Python
- 14. Come memorizzare un riferimento a un numero intero in C#?
- 15. C# che converte un decimale in un int in modo sicuro
- 16. Come convertire la stringa in numero intero in C#
- 17. Leggi due byte in un numero intero?
- 18. Come ottenere un numero decimale quando si divide in bc?
- 19. Converti numero stringa in numero intero
- 20. Go: converte stringhe in array in numero intero
- 21. Memorizzare un numero intero in un carattere * in C++
- 22. Come rimuovere la parte decimale da un numero in C#
- 23. Come si verifica se un numero in virgola mobile è un numero intero in haskell?
- 24. Come convertire un numero intero in char in C?
- 25. VB2010 Come capire se un numero è un intero intero
- 26. Come convertire un numero intero in serie
- 27. Come estrarre un numero intero da un NSDictionary e inserirlo in un numero intero?
- 28. Numero decimale dominante in un array
- 29. parametro di uscita decimale arrotondato al numero intero in EF5.0
- 30. Conversione di un size_t in un numero intero (C++)
Sarebbe utile sapere se si voleva arrotondare al più vicino int o semplicemente cadere i numeri dopo la virgola (es: arrotondare sempre verso il basso) – Dinah
Sinceramente non vedo il punto in downvoting domande genuine. sì, la risposta potrebbe essere trovata su google, ma non sarebbe solo migliorare la qualità del sito se la gente smettesse di chiudere ogni seconda domanda? non è come se questa domanda fosse spam o altro, e sono sicuro che sarebbe utile per molti new-comer di C# –