2013-08-24 6 views
28

Próbowałem sprawić, aby odpowiedź została wydrukowana z dokładnością do dwóch miejsc po przecinku. Cała zaangażowana matematyka musi pozostać w tym formacie z dwoma miejscami po przecinku. Próbowałem kilku rzeczy i nie jestem pewien, co zmienić, aby to działało.Formatowanie od podwójnego do dwóch miejsc po przecinku

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

co nie działa? – Stobor

+2

Prawdopodobnie nie chcesz używać zmiennoprzecinkowej dla waluty - w końcu gryzą Cię błędy zaokrąglania. Wygląda na to, że nic nie jest wbudowane, ale zobacz linki takie jak http://www.codeproject.com/Articles/28244/A-Money-for-for-- -CLR w celu uzyskania inspiracji. Po tym, jak zaczniesz robić takie rzeczy jak obliczenia procentowe, nie możesz tak naprawdę unikać dodawania kilku miejsc po przecinku ... – canton7

+0

Potrzebuję podwójnych pozycji, aby zawsze pozostać z dwoma miejscami po przecinku, ale odpowiedź nie będzie tego odzwierciedlić. więc format: 209,00 (jeśli wybrałeś 1 produkt dla trzeciego produktu i zero dla wszystkich innych, to powinna być odpowiedź.) –

Odpowiedz

50

string.Format nie zmieni się wartość początkową, ale powróci sformatowany ciąg. Na przykład:

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

Uwaga: Console.WriteLine umożliwia wbudowane formatowanie ciągów znaków. Powyższe jest równoznaczne z:

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

Można zaokrąglić double do dwóch miejsc dziesiętnych jak to:

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

Ale uwaga zaokrąglenie w końcu cię ugryźć, więc należy używać go z rozwagą.

Zamiast tego należy użyć typu danych decimal.

+2

Próbowałem Math.Round i zbyt szybko wyniki stały się niewystarczające. –

+0

dlaczego różnica między podwójnym a dziesiętnym w zaokrągleniu? – batmaci

45

W zależności od potrzeb można wybrać jedną z poniższych opcji. Out put jest napisane na każdej metody

Można wybrać jedną trzeba

To zaokrąglić

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

Zapewni to 2 miejsca po przecinku są napisane.

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

jeśli chcesz napisać przecinki można użyć tego

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

jeśli chcesz powrócić zaokrąglonej wartości dziesiętnych można to zrobić

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

Ponieważ pracują w dlaczego nie po prostu to zrobić:

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

To będzie sformatować odpowiedź jako waluty, więc na moim komputerze (UK) to wyjdzie jak:

Zysk ten tydzień: 209,00 zł

3

Ja polecam ten stałoprzecinkowych („F”) w formacie specifier (jak wspomniał Ehsan). Zobacz Standard Numeric Format Strings.

Dzięki tej opcji można nawet mieć konfigurowalną liczbę miejsc po przecinku:

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