web-dev-qa-db-fra.com

Formater un double à deux décimales

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+"");
37
Dan Cairnes

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));
64
Damith

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
57
Ehsan

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.

11
Karl Anderson

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}");
}
7
anhoppe

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 £

2
Peter

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));
    }
0
philoroussel