2016-03-29 35 views
-1

Bir müşteri için bir uygulama geliştiriyorum. Toplam yemek fiyatı gibi konsoldan bazı girdiler almalı; artı, ikinci satır ipucu yüzdesini sormalıdır. Üçüncüsü vergi talebinde bulunur.Yüzde Sorunları

Aşağıdaki kodum var, ancak iki test durumundan biri başarısız oluyor. mealCoast için 15.50, ipucu için yüzde 15 ve vergi için% 10 girdiğimde, test vakasından geçiyor. Ancak, mealCost için 12.00, ipucu% 20 ve vergi yüzdesi için 8'e girersem, test durumu gereksinimlerini karşılayamaz.

Burada kod örnekimi görebilirsiniz.

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

kesinlikle yüzdeler n/100 * number_percent_wanted = sonucudur. İpuçları vergilendirilebilir mi? Emin misiniz? – BugFinder

+0

Girişlerinizi * beklenen ve gerçek çıkışlarla * ekleyin. Test vakanız neye benziyor? –

+2

Bir yan not olarak [Ondalık] (https://msdn.microsoft.com/en-us/library/364x0z75.aspx), 'çifte' para birimine daha uygundur. –

cevap

1

olası sorunların bir çift: İlk olarak

, tamsayı bölme dikkatli olun. Temel olarak int veri türünü int veri türüne böldüğünüzde int sonucunu elde edeceğiniz anlamına gelir. İyi bir uygulama değil, her yerde int'u kullandığınızı unutmayın. Uygulamanızda büyük olasılıkla bunu istemezsiniz. Ancak, para ile ilgili hesaplarınızda hassas olmak istersiniz. ya da daha iyi - - Böylece ben double kullanmayı önermek,

İkincisi veri hesaplaması için decimal ilgili sayı veri türüne dönüştürülemeyen string dikkat (o int veya kayan nokta double gibi olmak). Parse'u kullanmayın, ancak girişin dönüştürülebilir olduğundan emin olmak için TryParse kullanın.

Verileri işlemek için doğru veri türünü ve doğru yolu kullanarak, zaten hedeflerinizi gerçekleştirerek yarı yolda. kod içine koyarak, buna benzerdi nasıl geçerli:

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

yaptığınızda Muhtemelen 'Round' 'grandTotal' için 2 dp olmalıdır ya da belki de 'Yer', çünkü insanların yüzde kuruşluk bir ücret ödemesini bekleyemezsiniz. –

+0

@MattBurland ah evet, ödeme için kullanıldığında, muhtemelen 2 ondalık nokta büyük olasılıkla yeterli olurdu – Ian

+0

Teşekkürler Ian işe yaradı Sadece yuvarlak gandTotal her iki test vakası geçti ama gerçekten ne kadar aptaldım – Dev

1

ancak ikinci 15 usd olmalıdır gereken çıktı çıkış üretmek için başarısız mealPrice, vergi ipucu için 20 ve 8 için dava 12.00 da 14 usd yazdırır

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(); 

/ operatör i geçerli: garip bir şey taxtPercent değişken 0

s örneğin kodunuza bir göz atalım haline Eğer işlenenler tamsayı tipindeyse nteger bölümü. Dönemden sonraki tüm ondalık basamaklar truncate olacaktır. Bu ayrıca, atadığınız değişkenin türüne de bağlı değildir. decimal veya double veri tiplerine göz atın.