2016-05-26 28 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); 
} 
相關問題