9
votes

Pourquoi ces équations de division aboutissent-elles à zéro?

Le résultat de toutes les équations de division dans le ci-dessous pour la boucle est de 0. Comment puis-je l'obtenir pour me donner une décimale, par exemple: xxx pré>

code: p>

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();
        }
    }
}


2 commentaires

Je sais que ce n'est pas le point de la question ... mais je pense que 297.0 / 315 est 0.942857142857143 plutôt que 0.30793650793650793650793650793651. :)


Dupliqué possible de C # arrondit les divisions en soi


10 Réponses :


0
votes

parce que i est une valeur int et que vous divisez par un entier, le résultat est un entier! et vous devez donc diviser par 100,0 pour avoir une jette implicite dans le flotteur ou spécifier 100f ou 100d


0 commentaires

11
votes

Essayez

i / 100.0


2 commentaires

Cette réponse obtiendrait un uppote de moi s'il a également expliqué pourquoi cela fonctionnerait; o)


Le code des questions ne fonctionne pas car "/" - L'opérateur étant appelé avec des arguments entier de la division entier.S quels d'arguments est float ou double, puis "/" la division que vous attendez-vous. : 0)



5
votes

parce que i code> est une int strud>: i / 100 code> effectue une division entière, alors le résultat est toujours 0, est casse à la Type de cible. Vous devez spécifier au moins un littéral non-INT dans votre expression:

i / 100.0 


0 commentaires

30
votes

Vous utilisez INT / INT, qui fait tout entier arithmétique, même si vous attribuez une variable décimale / double / float.

force l'un des opérandes à être du type que vous souhaitez utiliser pour L'arithmétique. xxx

résultats: xxx

(etc)

Notez que ce n'est pas montrant la valeur exacte représentée par le flotteur ou le double - vous ne peut pas représenter 0,01 exactement comme flotteur ou double, par exemple. Le formatage des chaînes arrondit efficacement le résultat. Voir mon Article sur le point binaire flottant .NET pour plus d'informations ainsi qu'une classe qui Va vous laisser voir la valeur exacte d'un double.

Je n'ai pas dérangé en utilisant 100L pour résultat2 car le résultat serait toujours identique.


0 commentaires

2
votes

Parce que je suis un entier et 100 est un entier ... vous avez donc une division entière

essayer (décimal) i / 100.0 à la place


0 commentaires

1
votes

Peu importe où vous stockez, un entier divisé par un entier sera toujours un entier.


0 commentaires

0
votes

C'est la division entière quel que soit le type de variable que vous stockez, donc int / int = int


0 commentaires

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

0 commentaires

1
votes

Vous devez forcer une opération de point flottant "double / double" au lieu d'un "int / int" xxx


0 commentaires

0
votes

Dans mon cas, je n'avais que Vars et NO INT

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


0 commentaires