如何将 java 中的双精度数除以整数?

How to divide a double into whole integers in java?

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

给定一个 double、x(比如 100.5)和一个 int y(比如 3),我如何将其分成(大致相等的)部分和 return 包含 33、33 和 34.5 的列表.

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

当前代码:

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 < number 和其他情况。

最优雅的方法是什么?

如何使用

public BigDecimal setScale(int newScale, int roundingMode)

对于所有情况,将比例设置为零并向下舍入。

然后遍历所有并保留 运行 总数,可以 diff'd 并添加到最后一个数字

我认为您几乎有了一个完整的解决方案,为 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;
}

我觉得你还差得远,

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

}

试一试,行不行就告诉我!

编辑 对不起,我一次简单的计算失败了,但现在可以了

与此处已发布的解决方案相同,但更短:

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