代码之家  ›  专栏  ›  技术社区  ›  Lincoln Marr

如何在java中将双精度数分割为整数?

  •  1
  • Lincoln Marr  · 技术社区  · 10 年前

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

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

    最优雅的方式是什么?

    4 回复  |  直到 10 年前
        1
  •  0
  •   Elliott Frisch    10 年前

    我认为您几乎有了一个完整的解决方案,为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
  •   Scary Wombat    10 年前

    使用如何

    public BigDecimal setScale(int newScale, int roundingMode)
    

    对于所有情况,将刻度设置为零并四舍五入。

    然后循环遍历所有项,并保持一个运行总计 diff'd 并添加到最后一个数字

        3
  •  0
  •   Benjamin Lucidarme    10 年前

    我想你还不算远,

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

    }

    试试看,如果可以的话,告诉我!

    编辑 对不起,我的简单计算失败了,但现在没事了

        4
  •  0
  •   erkfel    10 年前

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

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