Perché queste equazioni di divisione risultano in zero?

Il risultato di tutte le equazioni di divisione nel ciclo for sottostante è 0. Come posso ottenere di darmi un numero decimale, ad esempio:

297 / 315 = 0.30793650793650793650793650793651 

Codice:

 using System; namespace TestDivide { class Program { static void Main(string[] args) { for (int i = 0; i <= 100; i++) { decimal result = i / 100; long result2 = i / 100; double result3 = i / 100; float result4 = i / 100; Console.WriteLine("{0}/{1}={2} ({3},{4},{5}, {6})", i, 100, i / 100, result, result2, result3, result4); } Console.ReadLine(); } } } 

Risposta:

Grazie Jon e tutti, questo è quello che volevo fare:

 using System; namespace TestDivide { class Program { static void Main(string[] args) { int maximum = 300; for (int i = 0; i <= maximum; i++) { float percentage = (i / (float)maximum) * 100f; Console.WriteLine("on #{0}, {1:#}% finished.", i, percentage); } Console.ReadLine(); } } } 

Stai usando int / int, che fa tutto nell’aritmetica dei numeri interi anche se stai assegnando una variabile decimale / doppia / variabile.

Forza uno degli operandi al tipo che vuoi usare per l’aritmetica.

 for (int i = 0; i < = 100; i++) { decimal result = i / 100m; long result2 = i / 100; double result3 = i / 100d; float result4 = i / 100f; Console.WriteLine("{0}/{1}={2} ({3},{4},{5}, {6})", i, 100, i / 100d, result, result2, result3, result4); } 

risultati:

 0/100=0 (0,0,0, 0) 1/100=0.01 (0.01,0,0.01, 0.01) 2/100=0.02 (0.02,0,0.02, 0.02) 3/100=0.03 (0.03,0,0.03, 0.03) 4/100=0.04 (0.04,0,0.04, 0.04) 5/100=0.05 (0.05,0,0.05, 0.05) 

(eccetera)

Nota che questo non mostra il valore esatto rappresentato dal float o il double - non puoi rappresentare 0,01 esattamente come un float o double, per esempio. La formattazione della stringa arrotonda efficacemente il risultato. Vedi il mio articolo su .NET punto binario mobile per ulteriori informazioni e una class che ti permetterà di vedere il valore esatto di un doppio.

Non mi sono preoccupato di usare 100L per result2 perché il risultato sarebbe sempre lo stesso.

Provare

 i / 100.0 

perché i è un int : i / 100 esegue la divisione intera, quindi il risultato, che è sempre 0, viene convertito nel tipo di destinazione. Devi specificare almeno un letterale non int nella tua espressione:

 i / 100.0 

Perché io è un numero intero e 100 è un numero intero … quindi hai una divisione intera

Prova (decimale) i / 100.0 invece

Non importa dove lo memorizzi, un intero diviso per un intero sarà sempre un numero intero.

È necessario forzare un’operazione a virgola mobile “double / double” invece di “int / int”

 double result = (double)297 / (double)315 ; 

questa è una divisione intera qualunque sia il tipo di variabile che si sta memorizzando, quindi int / int = int

 double result3 = ((double)i) / 100; 

Perché io è un valore int e tu dividi per un intero così il risultato è un numero intero! e quindi è necessario dividere per 100.0 per avere un cast implicito in float o specificare 100f o 100d

Nel mio caso avevo solo vars e no int

 float div = (var1 - var2) / float.Parse(var1.ToString());