2010-04-08 12 views
22

Per favore perdonare le mie conoscenze di programmazione. So che questa è una cosa semplice, ma non capisco perché il risultato sia sempre 0. Perché il decimale andrà bene?Perché non riesco a ottenere la percentuale utilizzando Int

int a = 100; 
int b = 200; 
decimal c = (a/b) * 100; 

Molte grazie.

+3

c = (a * 100)/b; – kenny

+3

Non funzionerà. a * 100/b tronca ancora il decimale e quindi converte in tipo decimale. Finiresti senza mantissa. – Armstrongest

+1

c = (a * 100M)/b; Inoltre, vedi http://mathworld.wolfram.com/IntegerDivision.html – Greg

risposta

54

La divisione intera tronca sempre il resto. Questo è fatto nel momento in cui il numero è diviso, non quando è assegnato alla variabile (come suppongo tu abbia ipotizzato).

decimal c = ((decimal)a/b) * 100; 
+0

Il troncamento è anche noto come operazione matematica del piano. –

+0

+1 per la modifica minima per correggere la risposta. –

+4

@ rlb.usa: Il fatto che si tratti di un pavimento adeguato dipende da come gestisce i negativi. Fuori mano, credo che cambi -1.2 a -1, non -2, però. –

13

Il valore a/b restituirà 0 sempre poiché sono numeri interi. Così, quando si valutano i valori all'interno delle parentesi che si sta facendo questo tecnicamente

decimal c = (0) * 100 

meglio fare,

decimal c = ((decimal)a/(decimal)b) * 100 
+0

-1 per una risposta confusa e fuorviante. 'int/int = int', che sembra sapere ma non ha spiegato. – ANeves

+2

"a/b restituirà sempre 0" a meno che non vengano forniti valori diversi per 'a' e' b', nel qual caso sarà 'a/b'. –

9

100/200 è 1/2 o 0,5. Dato che stai usando ints, si arrotonda a 0 (zero). E 0 * 100 è ancora 0. La parte all'interno delle parentesi viene sempre valutata per prima: se si vuole ottenere questo lavoro, utilizzare:

decimal c = (a * 100)/b; 

Edit: se si desidera un valore più preciso, piuttosto che una "percentuale intero "(vale a dire 33.333% invece del 33%), dovresti usare la risposta di Bragaadeesh.

+0

Come ho detto a Stu Mackellar, questo non funziona proprio perché tronca. –

+2

Se lo hai riscritto come '(a * 100M)/b', otterresti il ​​risultato che desideri. –

+0

@Steven, come ti ho detto nella sua risposta, potrebbe essere ciò che Daoming vuole. È così che ho interpretato la sua richiesta, dato che sta iniziando con gli ints e vuole una percentuale. @Anthony allo stesso modo, io * voglio * una risposta intera. – tloflin

0

renderlo decimal c = (a * 100)/b;

+0

Non penso che funzionerà come immagini. Arrotonderà. Ad esempio, se a = 1 eb = 3, vogliamo che c sia 33.333 (fino a quanti trailing 3 possiamo tenere). Con il tuo codice, avremmo 33.0 –

+0

True. L'OP non ha detto che voleva un numero reale, ma immagino sia implicito nel decimale. –

+4

Se lo hai riscritto come '(a * 100M)/b', otterresti il ​​risultato che desideri. –

2

Integer matematica è in corso di esecuzione, e il risultato è quindi essere memorizzati come decimale. 100/200 in matematica intera è 0. Per ottenere la tua percentuale, lanciare almeno un valore in decimale prima di eseguire il calcolo.

decimal c = (a/(decimal)b) * 100; 
0

int può essere solo numeri interi, in modo da 100/200 sta per essere 0. 0 * 100 è ancora 0. Cambiare il tipo da un decimale, e funzionerà

1

La matematica sta facendo è ancora una matematica intera.

(a/b) (100/200 o 1/2) viene eseguito su due numeri interi, quindi il risultato è zero. Zero * 100 è ... beh, ancora zero.

Il problema che si verifica è con l'ordine delle operazioni (aeb sono numeri interi, quindi viene eseguito un calcolo matematico intero).

suggerisco questo:

decimal c=((decimal)a)/((decimal)b)*100;

Questo costringerà la matematica eseguita per i valori decimali che cercate.

+0

Usa 100,0 M anziché 100 per evitare il costo del cast implicito. –

+0

Ma assicurati di usare 100.0M sul primo op. (Vedi altre risposte per chiarimenti). – ANeves

0

Durante l'utilizzo di numeri interi, questo '/' sta per DIV e questo '%' per MOD. DIV è il quoziente della divisione, MOD è il resto. Quindi, 100/200 = 0 e 100% 200 = 100.

Quindi, è necessario modificare i tipi a e b in decimal, nel tuo caso.

1

In lingue fortemente tipizzate, il risultato delle operazioni matematiche è solitamente lo stesso tipo del tipo più grande.

C# ha una lista di implicit numeric conversions che farà.

Generalizzazione di questo elenco: i tipi di integrale possono essere convertiti in tipi in virgola mobile, ma non viceversa. I tipi integrali possono anche essere convertiti implicitamente in decimal, ma i tipi a virgola mobile non possono.

Nota: questo significa anche che il cast di uno dei to in un altro tipo comporterà che l'intera risposta sia quel tipo. es: (decimal) a/b * 100.0 = 50.0

tl; dr:

In C#:

int/int = int 
int + decimal = decimal 
decimal + int = decimal 
int/int * decimal = (int/int = int) * decimal = decimal 
int - float = float 
int * double = double 
float/decimal = an error 
int - uint = an error (either that or ulong) 
+0

'100/200 * 100.0' sarebbe ancora 0 anche se produce un risultato decimale - attenzione. – ANeves

+0

@sr pt: il quarto esempio indica che. Nello specifico, con numeri sostituiti: '100/200 * 100.0 = (100/200 = 0) * 100.0 = 0.0' – Powerlord

Problemi correlati