Martin Fowler有一个 Money 类,它有一个货币分配例程。此例程根据给定的比率列表分配资金,而不会因四舍五入而损失任何价值。它将任何剩余值分布在结果上。
例如,按“比率”(1、1、1)分配的 100 美元将产生(34 美元、33 美元、33 美元)。
这是allocate
功能:
public long[] allocate(long amount, long[] ratios) {
long total = 0;
for (int i = 0; i < ratios.length; i++) total += ratios[i];
long remainder = amount;
long[] results = new long[ratios.length];
for (int i = 0; i < results.length; i++) {
results[i] = amount * ratios[i] / total;
remainder -= results[i];
}
for (int i = 0; i < remainder; i++) {
results[i]++;
}
return results;
}
(为了这个问题,为了简单起见,我冒昧地将 Money 类型替换为 long。)
问题是,我怎么知道它是正确的?除了最后的 for 循环之外,这一切似乎都是不言而喻的。我认为要证明函数是正确的,在最终的 for 循环中证明以下关系是正确的就足够了:
remainder < results.length
谁能证明这一点?