私は、これが印刷する答えを小数点以下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+"");
string.Format
は元の値を変更しませんが、フォーマットされた文字列を返します。例えば:
Console.WriteLine("Earnings this week: {0:0.00}", answer);
注:Console.WriteLine
は、インライン文字列フォーマットを許可します。上記は次と同等です:
Console.WriteLine("Earnings this week: " + string.Format("{0:0.00}", answer));
必要に応じて、次のいずれかを選択できます。出力は各メソッドに対して書き込まれます
必要なものを選択できます
これは丸めます
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
double
を次のように小数点以下2桁に丸めることができます。
double c;
c = Math.Round(c, 2);
しかし、丸めは最終的には噛むことに注意してくださいので、注意して使用してください。
代わりに、decimal
データ型を使用してください。
固定小数点( "F")形式指定子(Ehsanが述べたように)を再コメントします。 標準の数値書式文字列 を参照してください。
このオプションを使用すると、構成可能な小数点以下の桁数を持つこともできます。
public string ValueAsString(double value, int decimalPlaces)
{
return value.ToString($"F{decimalPlaces}");
}
あなたは通貨で働いているので、なぜこれを単純にしないのですか:
Console.Writeline("Earnings this week: {0:c}", answer);
これは回答を通貨としてフォーマットするため、私のマシン(UK)では次のようになります。
今週の収益:£209.00
問題は、すべて小数点以下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));
}