Perché non riesco a ottenere la percentuale usando Int

Per favore perdona 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?

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

Grazie molto.

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

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

Il valore a / b restituirà 0 sempre poiché sono numeri interi. Quindi, quando i valori all’interno delle parentesi sono valutati, lo stai facendo tecnicamente

 decimal c = (0) * 100 

Meglio fare,

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

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 vuoi farlo funzionare, usa:

 decimal c = (a * 100) / b; 

Modifica: se vuoi un valore più preciso piuttosto che una “percentuale intera” (33.333% anziché 33%), dovresti usare la risposta di Bragaadeesh.

Viene eseguito un calcolo matematico intero e il risultato viene quindi archiviato 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; 

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

C # ha una lista di conversioni numeriche implicite che farà.

Generalizzazione di questo elenco: i tipi integrali possono essere convertiti in tipi a virgola mobile, ma non viceversa. I tipi interi 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) 

La matematica che viene eseguita è ancora 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à i matematici ad eseguire i valori decimali che cerchi.

int può essere solo numeri interi, quindi 100/200 sarà 0. 0 * 100 è ancora 0. Cambia il tipo in un decimale, e funzionerà

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

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, nel tuo caso devi cambiare i tipi a e b in decimal .