Obtenir une valeur de 0 lors de la division 2 longs en c#
Je suis en train de diviser les valeurs de DriveInfo.AvailableFreeSpace & DriveInfo.TotalSize pour essayer et obtenir un pourcentage d'utiliser une barre de progression.
J'ai besoin de la valeur de fin d'être un int comme la progressbar.valeur implique un int et les méthodes ci-dessus, de retour d'un long.
J'ai ce que les valeurs:
164660715520---AvailableFreeSpace
256058060800---TotalSize
Quand j'essaye de mettre de la progressbar.valeur à l'aide de cette méthode, je reçois aussi une erreur:
progressBar1.Valeur=(int)(dInfo.AvailableFreeSpace/dInfo.TotalSize)*100;
Lorsque j'utilise ce code pour essayer d'obtenir une valeur qu'elle retourne 0.
label10.Text = (((int)dInfo.AvailableFreeSpace/dInfo.TotalSize)*100).ToString();
J'ai même essayé et ça ne fonctionne pas:
label10.Text = ((dInfo.AvailableFreeSpace/dInfo.TotalSize)*100).ToString();
Je sais que j'ai encore à faire la mise en forme de l'obtenir à regarder bonne, mais chaque fois que j'exécute le code, elle retourne 0.
Pourrait-il avoir quelque chose à voir avec la conversion de long int?
- La valeur de 164660715520/256058060800 est de 0,64. C'est pourquoi vous obtenez 0, j'imagine.
Vous devez vous connecter pour publier un commentaire.
Division entière retourne uniquement la partie entière. Donc 3/5 sera de 0. Vous aurez besoin de traiter au moins l'un des facteurs comme un nombre à virgule flottante. Essayez ceci:
*100
premier.int
.La première manière, casting
dInfo.AvailableFreeSpace
àint
droit de suite n'est pas d'aller travailler, parce que le nombre164660715520
que vous êtes en train de jeter ne rentre pas en 32 bits. Vous avez besoin de rester en 64 bits aussi longtemps que vous le pouvez.Le truc à éviter à virgule flottante arithmétique est de multiplier par
100
d'abord, et ensuite faire la division.Tant que le nombre de fois
100
est à l'intérieur de la taille (et dans votre cas, il est) le résultat a une bonne précision:Démo sur ideone (imprime 64).
faire de votre dInfo.AvailableFreeSpace et dInfo.TotalSize de décimales ou de type double pour éviter les jette
Ou
utilisation
label10.Text = (((double)dInfo.AvailableFreeSpace/dInfo.TotalSize)*100).ToString();
La valeur est arrondi à 0, comme
long
types de ne peut pas avoir de décimales, seulement des nombres entiers.Jeté comme une
decimal
type avant de multiplier par 100Par Exemple (Dans mon cas où j'en suis de calculer le pourcentage de la progression de la ProgressBar):
double someVariable = (double)longVariable1 /(double)longVariable2;
Code est donné ci-dessous:
J'ai peut-être un peu tard mais j'ai eu ce problème lorsque j'essaie de comparer les temps de. Finalement, j'ai jeté chaque timepsan à une chaîne et calculées manuellement le ratio