如何在java中将double分成整数?

时间:2016-05-26 01:15:25

标签: java math casting primitive-types

好的,所以我有以下问题,最好通过一个具体的例子来解释。

给定一个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;数量和其他情况。

最优雅的方法是什么?

4 个答案:

答案 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);
}