2016-05-26 23 views
1

好吧,所以我有以下问题,最好通过一个具体的例子来解释。给定一个double,x(比如说100.5)和一个int y(比如说3),我该如何将它分成(大致相等)部分并返回一个包含33,33和34.5的List。如何在java中将double分解为整数?

我希望列表中的所有元素都是整数(整数),除了最后一个。

当前代码:

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 <数量等情况了。

什么是最优雅的方式来做到这一点?

+1

下面给出了答案,他们的讨论,看来这个问题没有正确定义,你的解决方案只是其中的一个。我已经投票决定关闭它,因为目前还不清楚这种行为真的需要什么。我怀疑你不了解你自己。 –

+0

差不多等于不清楚 - 列表中的所有数字(除了最后一个)应该是相同的。 –

回答

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; 
} 
+1

是正确的,因为“0”是最接近的**整数**,可以适用于“8”插槽(8 * 1是8,大于“5” - 除非我们也可以使用负数)。 –

+0

为什么不''[1,0,1,0,1,0,1,0,1]'?给定参数中有多个有效答案。 –

0

如何使用

public BigDecimal setScale(int newScale, int roundingMode) 

,并适用于所有情况设置规模为零,向下取整。

然后通过所有循环,并保持运行总可以是diff'd并添加到最后一个数字

+0

@Thilo和正确的输出应该是? –

+0

@Thilo我会争辩说,前9个插槽中的前8个不仅是“大致相等”,而是相等的 –

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> =数字,你可以添加一个条件的情况下:

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; 
} 

}

T ry它,并说我是否可以!

编辑 对不起,我没在一个简单的演算,但现在已经没关系,已经在这里发布

+0

例如,9/4会给你: [2,2,2,3] 而4/9会给你: [1,1,1,1,0,0,0,0,0] –

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); 
} 
相关问题