好的,所以我有以下问题,最好通过一个具体的例子来解释。
给定一个double,x(比如100.5)和一个int y(比如说3),如何将其拆分为(大致相等)部分并返回包含33,33和34.5的List。
我希望列表中的所有元素都是整数(整数),除了最后一个。
当前代码:
private List<Double> splitIntoApproxEqualParts(double number, int numParts) {
List<Double> result = new ArrayList<Double>();
if (numParts <= 0) { return result; }
double qty = Math.floor(number / numParts);
for (int i = 0; i < numParts - 1; i++) {
result.add(qty);
}
result.add(qty + 1);
return result;
}
显然,这对于numParts&lt;数量和其他情况。
最优雅的方法是什么?
答案 0 :(得分:0)
如何使用
public BigDecimal setScale(int newScale, int roundingMode)
并且对于所有情况都将比例设置为零并向下舍入。
然后遍历所有并保持一个可以diff'd
的运行总计并添加到最后一个数字
答案 1 :(得分:0)
我认为你几乎有一个完整的解决方案,为1个部分添加一个处理程序,然后使用现有的qty
(但是从最初的number
中减去最后一个条目)。像,
private static List<Double> splitIntoApproxEqualParts(double number, int numParts) {
if (numParts <= 0) {
return Collections.emptyList();
} else if (numParts == 1) {
return Arrays.asList(number);
}
List<Double> result = new ArrayList<>(numParts);
double qty = Math.floor(number / numParts);
int t = numParts - 1;
IntStream.range(0, t).forEach(x -> result.add(qty));
result.add(number - (qty * t));
return result;
}
答案 2 :(得分:0)
我认为你不是那么远,
private List<Double> splitIntoApproxEqualParts(double number, int numParts) {
List<Double> result = new ArrayList<Double>();
if (numParts <= 0) { return result; }
double qty = Math.floor(number / numParts);
for (int i = 0; i < numParts - 1; i++) {
result.add((int)qty);
}
qty = (result.get(1))*(numParts-1);
result.add(number - qty);
return result;
}
对于numParts&gt; = number的情况,您可以添加条件:
private List<Double> splitIntoApproxEqualParts(double number, int numParts) {
List<Double> result = new ArrayList<Double>();
if (numParts <= 0) { return result; }
if(numParts >= number){
for( int i =0; 1 < number; i++){
result.add(1);
}
for( int i =0; 1 < numParts - number; i++){
result.add(0);
}
return result;
}
else{
double qty = Math.floor(number / numParts);
for (int i = 0; i < numParts - 1; i++) {
result.add((int)qty);
}
qty = (result.get(1))*(numParts-1);
result.add(number - qty);
return result;
}
}
尝试并告诉我它是否可以!
EDIT 对不起,我的一个简单的计算失败了,但现在没关系
答案 3 :(得分:0)
与此处发布的解决方案相同,但更短:
private List<Double> splitIntoApproxEqualParts(double number, int numParts) {
if (numParts == 0) return Collections.emptyList();
final Double[] result = new Double[numParts];
Arrays.fill(result, Math.floor(number / numParts));
// add remainder to the last number
result[numParts - 1] += number % numParts;
return Arrays.asList(result);
}