2016-03-29 7 views
-1

Ich entwickle eine App für einen Kunden. Es sollte einige Eingaben von der Konsole erhalten, wie Gesamtmahlzeitpreis; plus, sollte die zweite Zeile nach dem Spitzenprozentsatz fragen. Die dritte würde nach TaxPercent fragen.Probleme mit Prozent

Ich habe den folgenden Code, aber es schlägt einen von zwei Testfällen. Wenn ich 15.50 für mealCoast, 15 Prozent für Tipp und 10% für Steuern eingeben, besteht es den Testfall. Wenn ich jedoch 12,00 für mealCost, 20 für Spitze% und 8 für Steuerprozent eingeben, erfüllt es die Testfallanforderungen nicht.

Hier können Sie mein Codebeispiel sehen.

double mealCoast = double.Parse(Console.ReadLine()); 
     int tipPercent = int.Parse(Console.ReadLine()); 
     int taxPercent = int.Parse(Console.ReadLine()); 

     //Calculating % 
     tipPercent = Convert.ToInt16(mealCoast) * (tipPercent)/100; 
     taxPercent = Convert.ToInt16(mealCoast) * (taxPercent)/100; 

     int totalCast = Convert.ToInt16(mealCoast) + tipPercent + taxPercent; 

     Console.WriteLine("The total meal cost is {0} dollars.", totalCast); 

     Console.ReadKey(); 
+1

sicherlich Prozentsätze ist n/100 * number_percent_wanted = Ergebnis. Sind Trinkgelder steuerpflichtig? bist du sicher? – BugFinder

+0

Fügen Sie Ihre Eingaben * mit den erwarteten und tatsächlichen Ausgaben * hinzu. Wie sieht dein Testfall eigentlich aus? –

+2

Als eine Seitennotiz [Dezimal] (https://msdn.microsoft.com/en-us/library/364x0z75.aspx) ist mehr geeignet, um Währung zu behandeln, die "doppelt". –

Antwort

1

Ein paar mögliche Probleme:

Zum einen der Integer-Division in Acht nehmen. Es bedeutet im Grunde, dass wenn Sie int Datentyp von int Datentyp teilen, erhalten Sie int Ergebnis. Beachten Sie, dass Sie int überall verwenden, was keine gute Übung ist - in Ihrer Anwendung möchten Sie das wahrscheinlich nicht. Vielmehr möchten Sie in Ihrer geldbezogenen Berechnung genau sein. Daher schlage ich vor, double zu verwenden - oder besser - decimal für Ihre Datenberechnung

Zweitens, passen sie von den nicht wandelbaren string an den jeweiligen Zahl Datentyp (sei es int oder die Gleitkommaeinheit wie double). Verwenden Sie nicht Parse, aber verwenden Sie TryParse, um sicherzustellen, dass der Eingang konvertierbar ist.

Durch die Verwendung des richtigen Datentyps und die korrekte Verarbeitung der Daten würden Sie Ihre Ziele bereits zur Hälfte erreichen. sie in einem Code setzen, das ist, wie es aussehen kann:

decimal mealCoast, tipPercent, taxPercent; //use decimal, probably is best 
bool mealCoastResult = decimal.TryParse(Console.ReadLine(), out mealCoast); 
bool tipPercentResult = decimal.TryParse(Console.ReadLine(), out tipPercent); //use TryParse 
bool taxPercentResult = decimal.TryParse(Console.ReadLine(), out taxPercent); 

//Input checking, check any parsing error 
if (!mealCoastResult || !tipPercentResult || !taxPercentResult){ 
    //do some error handlers 
    return; //probably don't continue is good 
} 
//you could also put some while loop 

//Calculating % 
tipPercent = mealCoast * tipPercent/100; 
taxPercent = mealCoast * taxPercent/100; 

decimal grandTotal = mealCoast + tipPercent + taxPercent; 
Console.WriteLine("The total meal cost is {0} dollars.", grandTotal); 
Console.ReadKey(); 
+0

Du solltest wahrscheinlich entweder 'Round'' grandTotal' zu 2 dp oder vielleicht "Floor", denn man kann nicht wirklich erwarten, dass die Leute in Bruchteilen von einem Cent bezahlen. –

+0

@MattBurland ah ja, wenn es für die Zahlung verwendet wird, würde wahrscheinlich 2 Dezimalstellen höchstwahrscheinlich ausreichen – Ian

+0

Dank Ian es funktioniert Nur abgerundet gandTotal beide Testfälle bestanden aber wirklich wie dumm ich war – Dev

1

jedoch zweiter Fall 12,00 für mealPrice, 20 für Spitze und 8 für die Steuer erforderlichen Ausgang Ausgabe zu erzeugen, nicht 15 usd sein sollte, er druckt 14 usd merkwürdige taxtPercent Variable werden 0

Nehmen wir zum Beispiel an Ihrem Code einen Blick:

double mealCoast = double.Parse(Console.ReadLine()); // mealCoast = 12. 
int tipPercent = int.Parse(Console.ReadLine()); // tipPercent = 20 
int taxPercent = int.Parse(Console.ReadLine()); // taxPercent = 8 

//Calculating % 
// Convert.ToInt16(mealCoast) will give you 12 
// you are using integer division here, no digits preserved after period. 
tipPercent = Convert.ToInt16(mealCoast) * (tipPercent)/100; // 12 * 20/100 = 2 
taxPercent = Convert.ToInt16(mealCoast) * (taxPercent)/100; // 12 * 8/100 = 0 

// 12 + 2 + 0 = 14 
int totalCast = Convert.ToInt16(mealCoast) + tipPercent + taxPercent; // 14 
Console.WriteLine("The total meal cost is {0} dollars.", totalCast); 

Console.ReadKey(); 

/ Operator i nteger division, wenn seine Operanden ganzzahlige Typen sind. Es wird abgeschnitten alle Dezimalziffern nach Zeitraum. Dies hängt auch nicht vom Typ der Variablen ab, der Sie result at zuweisen. Sehen Sie sich die Datentypen decimal oder double an.