web-dev-qa-db-ja.com

小数点以下2桁から2桁のフォーマット

私は、これが印刷する答えを小数点以下2桁にしようとしています。関係するすべての数学は、小数点以下2桁の形式にとどまる必要があります。私はいくつかのことを試してみましたが、この作品を作るために何を変えるべきか分かりません。

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

string.Formatは元の値を変更しませんが、フォーマットされた文字列を返します。例えば:

Console.WriteLine("Earnings this week: {0:0.00}", answer);

注:Console.WriteLineは、インライン文字列フォーマットを許可します。上記は次と同等です:

Console.WriteLine("Earnings this week: " + string.Format("{0:0.00}", answer));
67
Damith

必要に応じて、次のいずれかを選択できます。出力は各メソッドに対して書き込まれます

必要なものを選択できます

これは丸めます

decimal d = 2.5789m;
Console.WriteLine(d.ToString("#.##")); // 2.58

これにより、小数点以下2桁が書き込まれます。

d = 2.5m;
Console.WriteLine(d.ToString("F")); //2.50

カンマを書きたい場合は、これを使用できます

d=23545789.5432m;
Console.WriteLine(d.ToString("n2")); //23,545,789.54

小数点以下を丸めた値を返したい場合は、これを行うことができます

d = 2.578m;
d = decimal.Round(d, 2, MidpointRounding.AwayFromZero); //2.58
62
Ehsan

doubleを次のように小数点以下2桁に丸めることができます。

double c;
c = Math.Round(c, 2);

しかし、丸めは最終的には噛むことに注意してくださいので、注意して使用してください。

代わりに、decimalデータ型を使用してください。

12
Karl Anderson

固定小数点( "F")形式指定子(Ehsanが述べたように)を再コメントします。 標準の数値書式文字列 を参照してください。

このオプションを使用すると、構成可能な小数点以下の桁数を持つこともできます。

public string ValueAsString(double value, int decimalPlaces)
{
    return value.ToString($"F{decimalPlaces}");
}
9
anhoppe

あなたは通貨で働いているので、なぜこれを単純にしないのですか:

Console.Writeline("Earnings this week: {0:c}", answer);

これは回答を通貨としてフォーマットするため、私のマシン(UK)では次のようになります。

今週の収益:£209.00

2
Peter

問題は、すべて小数点以下2桁の数値の加算と乗算を行うとき、丸め誤差がないことを期待しますが、doubleの内部表現は10進数ではなく2進数にあることに注意してください!したがって、基数10の0.1のような数値は、基数2にある可能性があります:0.101010101010110011 ...小数点以下の数は無限です(doubleに格納される値は、次のように数値Nになります。

 0.1-Math.Pow(2,-64) < N < 0.1+Math.Pow(2,-64) 

結果として、12.3 + 0.1のような演算は、丸め誤差のために、12.4と同じ正確な64ビットdouble値ではない場合があります(または12.456 * 10は124.56と同じでない場合があります)。たとえば、データベースに12.3 +0.1の結果を倍精度数値型のテーブル/列フィールドに格納してから、SELECT WHERE xx = 12.4にすると、正確に12.4ではない数値を格納したことがわかり、Sql selectはレコードを返さない;したがって、decimalデータ型(10を基数とする内部表現)を使用できず、 'double'データ型を使用する必要がある場合、各加算または乗算の後に正規化を行う必要があります。

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