Итак, я сделал эту довольно простую программу оптимальных изменений, которая в большинстве случаев отлично работает. Но по какой-то странной причине он действует непоследовательно и иногда не добавляет последнюю необходимую копейку, но в других случаях это будет.
Я пробовал разные выходы, и код всегда выходит правильно, за исключением иногда последней копейки; при использовании американской валюты. Я уверен, что причина очевидна, но я ее просто не вижу.
public static int[] optimal_change(double[] currency, double amount) {
int[] count = new int[currency.length];
for (int i = 0; i < currency.length; i++) {
if (amount >= currency[i]) {
amount -= currency[i];
count[i]++;
i--;
}
if (amount == 0.0000) {
break;
}
}
return count;
}
public static void main(String[] args) {
double[] american_currency = {100,50,20,10,5,1,0.25,0.10,0.05,0.01};
//Japanese currency: https://www.boj.or.jp/en/note_tfjgs/note/valid/index.htm/
double[] japanese_currency = {10000,5000,2000,1000,500,100,50,10,5,1};
int[] american_change = optimal_change(american_currency, 78.36);
int[] japanese_change = optimal_change(japanese_currency, 793048);
System.out.println("Optimal change for: $78.38");
for (int i = 0; i < american_currency.length; i++) {
if (i <= 5) {
System.out.println(Integer.toString(american_change[i]) + " $" + Double.toString(american_currency[i]));
} else {
System.out.println(Integer.toString(american_change[i]) + " " + Double.toString(american_currency[i]) + "¢");
}
}
System.out.println("--------------------------");
System.out.println("Optimal change for: ¥793040");
for (int i = 0; i < japanese_currency.length; i++) {
System.out.println(Integer.toString(japanese_change[i]) + " ¥" + Double.toString(japanese_currency[i]));
}
}
Правильные результаты:
ввод: 78,37
выход:
Оптимальная сдача для: 78,37 $
0 $100.0
1 $50.0
1 $20.0
0 $10.0
1 $5.0
3 $1.0
1 0.25¢
1 0.1¢
0 0.05¢
2 0.01¢
Неправильные результаты:
ввод: 78,38
выход:
Оптимальная сдача для: 78,38 $
0 $100.0
1 $50.0
1 $20.0
0 $10.0
1 $5.0
3 $1.0
1 0.25¢
1 0.1¢
0 0.05¢
2 0.01¢
Результат должен был быть:
Оптимальная сдача для: 78,38 $
0 $100.0
1 $50.0
1 $20.0
0 $10.0
1 $5.0
3 $1.0
1 0.25¢
1 0.1¢
0 0.05¢
3 0.01¢
double
для обозначения валюты. Это имеет серьезные проблемы, потому что валюта, естественно, является десятичной, и не все десятичные значения могут быть точно представлены в двоичной системе с плавающей запятой. Например, значение 0,1 невозможно представить точно. Варианты: 1) используйте целые числа, представляющие количество центов (и т. Д.), А не долларов. 2) используйте BigDecimal, который является десятичным типом с плавающей запятой. - person Jon Skeet   schedule 17.04.2019