Подтвердить что ты не робот

Форматирование двух-двух знаков после запятой

Я пытаюсь сделать так, чтобы этот отпечаток был до двух знаков после запятой. Вся необходимая математика должна оставаться в этом формате с двумя знаками после запятой. Я пробовал несколько вещей, и я не уверен, что изменить, чтобы сделать эту работу.

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+"");
4b9b3361

Ответ 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