2016-04-15 5 views
0

Я хочу создать небольшую систему, которая возвращает мне оптимизированное количество векселей и монет для любой стоимости.Получите количество векселей и монет за любое значение

Вот мой код время:

public static void main(String[] args) throws IOException { 
    BufferedReader br = new BufferedReader(
      new InputStreamReader(System.in)); 
    double amount = Double.parseDouble(br.readLine()); 
    if (amount > 0 && amount < 1000000.00) { 
     // ############################# BILLS ############################ 
     double rest100 = amount/100; 
     double rest50 = amount % 100; 
     double rest20 = rest50 % 50; 
     double rest10 = rest20 % 20; 
     double rest5 = rest10 % 10; 
     double rest2 = rest5 % 5; 

     // ############################ COINS ############################    
     double rest01 = rest2 % 2; 
     double rest050 = rest01 % 1; 
     double rest025 = rest050 % .5; 
     double rest010 = rest025 % 25; 
     double rest005 = rest010 % .1; 
     double rest001 = rest005 % .05; 

     System.out.println("BILLS:\n" 
      + (int) rest100 
      + " bill(s) of 100.00\n" 
      + (int) rest50/50 
      + " bill(s) of 50.00\n" 
      + (int) rest20/20 
      + " bill(s) of 20.00\n" 
      + (int) rest10/10 
      + " bill(s) of 10.00\n" 
      + (int) rest5/5 
      + " bill(s) of 5.00\n" 
      + (int) rest2/2 
      + " bill(s) of 2.00\n" 
      + "COINS:\n" 
      + (int) (rest01/1) 
      + " coin(s) of 1.00\n" 
      + (int) (rest050/.5) 
      + " coin(s) of 0.50\n" 
      + (int) (rest025/.25) 
      + " coin(s) of 0.25\n" 
      + (int) (rest010/.1) 
      + " coin(s) of 0.10\n" 
      + (int) (rest005/.05) 
      + " coin(s) of 0.05\n" 
      + (int) (rest001/.01) 
      + " coin(s) of 0.01"); 
    } 
} 

Ну, это почти правильно, счета работают идеально, моя проблема с монетами.

Вот некоторые входы:

  • 576,73 // Печать правильно
  • 8,45 // Печать неправильно
  • 9,45 // Печать неправильно, смотрите ниже:

Фактический выход:

BILLS: 
0 bill(s) of 100.00 
0 bill(s) of 50.00 
0 bill(s) of 20.00 
0 bill(s) of 10.00 
1 bill(s) of 5.00 
2 bill(s) of 2.00 
COINS: 
0 coin(s) of 1.00 
0 coin(s) of 0.50 
1 coin(s) of 0.25 
4 coin(s) of 0.10 
0 coin(s) of 0.05 
4 coin(s) of 0.01 

Expec Ted выход:

BILLS: 
0 bill(s) of 100.00 
0 bill(s) of 50.00 
0 bill(s) of 20.00 
0 bill(s) of 10.00 
1 bill(s) of 5.00 
2 bill(s) of 2.00 
COINS: 
0 coin(s) of 1.00 
0 coin(s) of 0.50 
1 coin(s) of 0.25 
2 coin(s) of 0.10 
0 coin(s) of 0.05 
0 coin(s) of 0.01 

PS: Я не буду размещать все ожидаемые результаты, так как это позволит вопрос больше, чем сейчас, но если вам нужно, я могу отправить. Заранее спасибо.

+2

Я подозреваю, что проблема заключается в 0,1, 0,05, и 0,01, поскольку они не могут быть точно представлены в виде числа с плавающей точкой. Рассмотрите возможность использования целого для этой задачи, поскольку целые операции являются точными и быстрыми. –

+0

Вы используете math.floor (rest100):? И почему у вас есть 50-процентная монета? – kpie

+1

@kpie действительно ни за что .. ошибка, но это не имеет значения (к сожалению). В моей стране существует монета достоинством 50 центов. – developer033

ответ

0

Следующая версия кода будет работать согласно вашим требованиям. Избегайте использования операции с двойным модулем.

КОД:

public static void main(String[] args) throws NumberFormatException, IOException { 
    BufferedReader br = new BufferedReader(
      new InputStreamReader(System.in)); 
    double amount = Double.parseDouble(br.readLine()); 
    amount= Math.round(amount*100);  
    if (amount > 0 && amount < 1000000.00) {    
     // ############################# BILLS ############################ 
     double rest100 = amount/10000; 
     double rest50 = amount % 10000; 
     double rest20 = rest50 % 5000; 
     double rest10 = rest20 % 2000; 
     double rest5 = rest10 % 1000; 
     double rest2 = rest5 % 500; 

     // ############################ COINS ############################    
     double rest01 = rest2 % 200; 
     double rest050 = rest01 % 100; 
     double rest025 = rest050 % 50; 
     double rest010 = rest025 % 25; 
     double rest005 = rest010 % 10; 
     double rest001 = rest005 % 5; 

     System.out.println("BILLS:\n" 
      + (int) Math.floor(rest100) 
      + " bill(s) of 100.00\n" 
      + (int) (rest50/5000) 
      + " bill(s) of 50.00\n" 
      + (int) (rest20/2000) 
      + " bill(s) of 20.00\n" 
      + (int) (rest10/1000) 
      + " bill(s) of 10.00\n" 
      + (int) (rest5/500) 
      + " bill(s) of 5.00\n" 
      + (int) (rest2/200) 
      + " bill(s) of 2.00\n" 
      + "COINS:\n" 
      + (int) (rest01/100) 
      + " coin(s) of 1.00\n" 
      + (int) (rest050/50) 
      + " coin(s) of 0.50\n" 
      + (int) (rest025/25) 
      + " coin(s) of 0.25\n" 
      + (int) (rest010/10) 
      + " coin(s) of 0.10\n" 
      + (int) (rest005/5) 
      + " coin(s) of 0.05\n" 
      + (int) (rest001/1) 
      + " coin(s) of 0.01"); 
    } 

ВЫХОД:

9.45 
BILLS: 
0 bill(s) of 100.00 
0 bill(s) of 50.00 
0 bill(s) of 20.00 
0 bill(s) of 10.00 
1 bill(s) of 5.00 
2 bill(s) of 2.00 
COINS: 
0 coin(s) of 1.00 
0 coin(s) of 0.50 
1 coin(s) of 0.25 
2 coin(s) of 0.10 
0 coin(s) of 0.05 
0 coin(s) of 0.01 
+0

Это не работает. Протестировано с 9.45 и возвращает мне другой результат, чем ожидалось. – developer033

+0

@ developer033 Я исправил проблему с кодом, пожалуйста, попробуйте еще раз – alphablue

+0

Спасибо. Оно работает!! – developer033

1

Просто умножьте на 100 и выполните вычисления в центах.

+1

Я подтвердил ваш ответ (даже если другие не видели причину): я бы избегал арифметики по модулю с номерами с плавающей запятой из-за ошибок округления. Умножьте на 100 и используйте целые числа. –

+0

Thx, я согласен, это, безусловно, самое человеческое решение:) – kpie