J'ai essayé de faire la réponse cela s'imprime être à deux décimales. Toutes les maths impliquées doivent rester à ce format de deux décimales. J'ai essayé plusieurs choses et je ne sais pas quoi changer pour que cela fonctionne.
double pdt1 = 239.99;
double pdt1Total;
double pdt2 = 129.75;
double pdt2Total;
double pdt3 = 99.95;
double pdt3Total;
double pdt4 = 350.89;
double pdt4Total;
double wage = 200;
double percentage = 9;
double total;
double answer;
double i = 100;
double a;
double b;
double c;
double d;
Console.Write("Enter number sold of product #1: ");
a = Convert.ToInt32(Console.ReadLine());
Console.Write("Enter number sold of product #2: ");
b = Convert.ToInt32(Console.ReadLine());
Console.Write("Enter number sold of product #3: ");
c = Convert.ToInt32(Console.ReadLine());
Console.Write("Enter number sold of product #4: ");
d = Convert.ToInt32(Console.ReadLine());
pdt1Total = a * pdt1;
pdt2Total = b * pdt2;
pdt3Total = c * pdt3;
pdt4Total = d * pdt4;
total = (pdt1Total + pdt2Total + pdt3Total + pdt4Total);
string.Format("{0:0.00}", total);
string.Format("{0:0.00}", answer = (total * percentage / i) + wage);
Console.WriteLine("Earnings this week: "+answer+"");
string.Format
ne changera pas la valeur d'origine, mais retournera une chaîne formatée. Par exemple:
Console.WriteLine("Earnings this week: {0:0.00}", answer);
Remarque: Console.WriteLine
permet le formatage de chaîne en ligne. Ce qui précède est équivalent à:
Console.WriteLine("Earnings this week: " + string.Format("{0:0.00}", answer));
En fonction de vos besoins, vous pouvez choisir l’un des éléments suivants. Out put est écrit contre chaque méthode
Vous pouvez choisir celui dont vous avez besoin
Cela va arrondir
decimal d = 2.5789m;
Console.WriteLine(d.ToString("#.##")); // 2.58
Cela garantira que 2 décimales sont écrites.
d = 2.5m;
Console.WriteLine(d.ToString("F")); //2.50
si vous voulez écrire des virgules, vous pouvez utiliser ceci
d=23545789.5432m;
Console.WriteLine(d.ToString("n2")); //23,545,789.54
si vous voulez renvoyer l’arrondi de la valeur décimale, vous pouvez le faire
d = 2.578m;
d = decimal.Round(d, 2, MidpointRounding.AwayFromZero); //2.58
Vous pouvez arrondir une double
à deux décimales, comme ceci:
double c;
c = Math.Round(c, 2);
Mais attention, vous finirez par vous mordre, alors utilisez-le avec prudence.
Utilisez plutôt le type de données decimal
.
Je recommanderais le spécificateur de format Fixed-Point ("F") (comme mentionné par Ehsan). Voir le Chaînes de format numérique standard .
Avec cette option, vous pouvez même avoir un nombre configurable de décimales:
public string ValueAsString(double value, int decimalPlaces)
{
return value.ToString($"F{decimalPlaces}");
}
Puisque vous travaillez en devise, pourquoi ne pas simplement faire ceci:
Console.Writeline("Earnings this week: {0:c}", answer);
Cela formatera answer en tant que devise, donc sur ma machine (UK), il sortira comme:
Gains cette semaine: 209,00 £
Le problème est que, lorsque vous effectuez des additions et des multiplications de nombres, tous avec deux décimales, vous vous attendez à ce qu'il n'y ait pas d'erreur d'arrondi, mais n'oubliez pas que la représentation interne de double est en base 2, pas en base 10! Donc un nombre comme 0.1 en base 10 peut être en base 2: 0.101010101010110011 ... avec un nombre infini de décimales (la valeur stockée dans le double sera un nombre N avec:
0.1-Math.Pow(2,-64) < N < 0.1+Math.Pow(2,-64)
En conséquence, une opération telle que 12.3 + 0.1 peut ne pas être identique à la valeur double exacte de 64 bits de 12.4 (ou 12.456 * 10 peut ne pas être identique à 124.56) en raison d'erreurs d'arrondi . Par exemple, si vous enregistrez dans une base de données le résultat de 12.3 +0.1 dans un champ table/colonne de type numéro double précision, puis SELECT WHERE xx = 12.4, vous pouvez vous rendre compte que vous avez enregistré un nombre différent de 12.4 et que la sélection Sql ne renverra pas l’enregistrement; Donc, si vous ne pouvez pas utiliser le type de données décimal (qui a une représentation interne en base 10) et devez utiliser le type de données 'double', vous devez effectuer une normalisation après chaque addition ou multiplication:
double freqMHz= freqkHz.MulRound(0.001); // freqkHz*0.001
double amountEuro= amountEuro.AddRound(delta); // amountEuro+delta
public static double AddRound(this double d,double val)
{
return double.Parse(string.Format("{0:g14}", d+val));
}
public static double MulRound(this double d,double val)
{
return double.Parse(string.Format("{0:g14}", d*val));
}