Форматирование двух-двух знаков после запятой
Я пытаюсь сделать так, чтобы этот отпечаток был до двух знаков после запятой. Вся необходимая математика должна оставаться в этом формате с двумя знаками после запятой. Я пробовал несколько вещей, и я не уверен, что изменить, чтобы сделать эту работу.
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+"");
Ответы
Ответ 1
string.Format
не изменит исходное значение, но вернет отформатированную строку. Например:
Console.WriteLine("Earnings this week: {0:0.00}", answer);
Примечание: Console.WriteLine
позволяет форматировать строковые строки. Вышеуказанное эквивалентно:
Console.WriteLine("Earnings this week: " + string.Format("{0:0.00}", answer));
Ответ 2
Ну, в зависимости от ваших потребностей вы можете выбрать любое из следующих. Out put написан против каждого метода
Вы можете выбрать тот, который вам нужен.
Это будет круглый
decimal d = 2.5789m;
Console.WriteLine(d.ToString("#.##")); // 2.58
Это обеспечит запись двух знаков после запятой.
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
Ответ 3
Вы можете округлить double
до двух знаков после запятой, например:
double c;
c = Math.Round(c, 2);
Но будьте осторожны, округление в конечном итоге укусит вас, поэтому используйте его с осторожностью.
Вместо этого используйте тип данных decimal
.
Ответ 4
Я бы рекомендовал спецификатор формата с фиксированной точкой ("F") (как упомянуто Ehsan). См. Стандартные строки числового формата.
С помощью этой опции вы даже можете задать настраиваемое количество десятичных знаков:
public string ValueAsString(double value, int decimalPlaces)
{
return value.ToString($"F{decimalPlaces}");
}
Ответ 5
Поскольку вы работаете в валюте, почему бы просто не сделать это:
Console.Writeline("Earnings this week: {0:c}", answer);
Это будет отформатировать ответ как валюту, поэтому на моей машине (в Великобритании) это будет выглядеть как:
Заработок на этой неделе: £ 209,00
Ответ 6
Проблема в том, что когда вы выполняете сложение и умножение чисел с двумя десятичными разрядами, вы ожидаете, что ошибок округления не будет, но помните, что внутреннее представление double находится в базе 2, а не в базе 10! Таким образом, число типа 0,1 в базе 10 может быть в базе 2: 0,101010101010110011... с бесконечным числом десятичных знаков (значение, сохраненное в двойном числе, будет числом N с:
0.1-Math.Pow(2,-64) < N < 0.1+Math.Pow(2,-64)
Как следствие, такая операция, как 12,3 + 0,1, может не совпадать с двойным 64-битным значением, равным 12,4 (или 12,456 * 10 может не совпадать с 124,56) из-за ошибок округления. Например, если вы сохраните в базе данных результат 12.3 +0.1 в поле таблицы/столбца с типом числа с двойной точностью, а затем ВЫБЕРИТЕ, ГДЕ xx = 12.4, вы можете понять, что вы сохранили число, которое не совсем 12.4, и что Sql select не вернет запись; Поэтому, если вы не можете использовать десятичный тип данных (который имеет внутреннее представление в базе 10) и должны использовать "двойной" тип данных, вы должны выполнить некоторую нормализацию после каждого сложения или умножения:
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));
}
Ответ 7
double d = 3.1493745;
string s = $"{d:0.00}"; // or $"{d:#.##}"
Console.WriteLine(s); // Displays 3.15