2013-03-13 3 views
-1

У меня возникли проблемы с конкретным заданием моей домашней работы. Это кажется почти невозможным. Вопрос идет так ...Использование целого числа вместо десятичного

«В будущем вы можете работать с другими языками программирования, которые не имеют такого типа, как десятичный, который поддерживает точные денежные вычисления. На этих языках вы должны выполнять такие вычисления с использованием целых чисел. Измените приложение, чтобы использовать только целые числа, чтобы рассчитать сложный процент. Рассматривайте все денежные суммы как целое число копеек. Затем разбивайте результат на свои доллары и центами, используя операции разделения и остатка соответственно. Вставьте период между долларами и когда вы показываете результаты ».

Когда я следую указаниям и использую целые числа, я получаю эти ошибки переполнения, прежде чем я могу даже что-то отделить. Кто-нибудь знает, как это сделать? Вот исходный код, который должен быть изменен ...

 decimal amount; //amount on deposit at end of each year 
     decimal principal = 1000; //initial amount before interest 
     double rate = 0.05; //interest rate 

     //display headers 
     Console.WriteLine("Year{0,20}", "Amount on deposit"); 

     //calculate amount on deposit for each of ten years 
     for (int year = 1; year <= 10; year++) 
     { 
      //calculate new amount for specified year 
      amount = principal * 
       ((decimal)Math.Pow(1.0 + rate, year)); 

      //display the year and the amount 
      Console.WriteLine("{0,4}{1,20:C}", year, amount); 
     } 

Это код, который я до сих пор ...

 long amount; //amount on deposit at end of each year 
     long principal = 100000; //initial amount before interest 
     long rate = 5; //interest rate 
     long number = 100; 

     //display headers 
     Console.WriteLine("Year{0,20}", "Amount on deposit"); 

     //calculate amount on deposit for each of ten years 
     for (int year = 1; year <= 10; year++) 
     { 
      //calculate new amount for specified year 
      amount = principal * 
       ((long)Math.Pow(100 + rate, year)); 

      amount /= number; 

      number *= 10; 

      //display the year and the amount 
      Console.WriteLine("{0,4}{1,20}", year, amount); 

Он получает некоторые из нужных чисел, но потом начинает выплевывать отрицательные числа по какой-то причине.

+5

Как вы изменили код? Каковы фактические сообщения об ошибках? – geoffspear

+1

Возможно, вам следует начать с рекомендации, приведенной в описании проблемы. Я вижу множественное использование типов данных, отличных от int и долгое время в вашем коде. –

+0

Я отредактировал свое оригинальное сообщение, чтобы включить код, который у меня есть. –

ответ

1

Просто чтобы дать вам подсказку:

int amount; 

//...some code... 
//let's pretend we have an amount of 100.97 
amount = (int)(100.97 * 100); // amount = 10097 
0

Math.Pow использует двойной. Он не используется долго.
В следующей строке вы несете лимитирующую ставку и год, чтобы удвоить.

amount = principal * 
    ((long)Math.Pow(100 + rate, year)); 

Таким образом, вы делаете это effectly:

double dRate = (double)(100 + rate); 
double dYear = (double)year; 
double dPow = Math.Pow(dRate, dYear); 
amount = principal * (long)dPow; 

Если вы хотите, чтобы ваша Pow функция действительно использовать долго, то вы, вероятно, нужно написать его самостоятельно.

Смежные вопросы