Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java8任何一个好的四舍五入算法都可以对bigdecimal进行四舍五入,并将总值返回为100_Java_Sorting - Fatal编程技术网

Java8任何一个好的四舍五入算法都可以对bigdecimal进行四舍五入,并将总值返回为100

Java8任何一个好的四舍五入算法都可以对bigdecimal进行四舍五入,并将总值返回为100,java,sorting,Java,Sorting,我目前正在寻找一个好的算法,将做取整,并返回总值为100。变量类型为BigDecimal 我必须以2位格式返回BigDecimal,例如10.10 结果应该是这样的: 名单上会有 18.56、20.96、18.56、19.16和22.75 18.56+20.96+18.56+19.16+22.75的总和应为100.00 使用这些值时,舍入应非常接近原始值。必须尽可能准确 这不是唯一的情况,可能有3、4、5、6到10个变量 任何帮助都将不胜感激 我对arraylist进行了四舍五入。 添加所有值

我目前正在寻找一个好的算法,将做取整,并返回总值为100。变量类型为BigDecimal

我必须以2位格式返回BigDecimal,例如10.10

结果应该是这样的:

名单上会有

18.56、20.96、18.56、19.16和22.75

18.56+20.96+18.56+19.16+22.75的总和应为100.00

使用这些值时,舍入应非常接近原始值。必须尽可能准确

这不是唯一的情况,可能有3、4、5、6到10个变量

任何帮助都将不胜感激

我对arraylist进行了四舍五入。 添加所有值 检查差异 现在我计划反转取整排序数组,并从第一个和第二个数组中减去差值,使之等于100。 我不确定这个算法有多好,但如果你有更好的想法,我会非常感激

 @Test
    public void roundDecimalValuesAndCalculateTotalToHundredPercent() {
        BigDecimal no1 = BigDecimal.valueOf(18.562874251497007);
        BigDecimal no2 = BigDecimal.valueOf(20.958083832335326);
        BigDecimal no3 = BigDecimal.valueOf(18.562874251497007);
        BigDecimal no4 = BigDecimal.valueOf(19.161676646706585);
        BigDecimal no5 = BigDecimal.valueOf(22.75449101796407);
        List<BigDecimal> value = Arrays.asList(no1, no2, no3, no4, no5);


        scaleAndPrintList(value);
    }


    private void scaleAndPrintList(List<BigDecimal> list) {
        list.forEach(bigDecimal -> {
            System.out.println("Number is " + bigDecimal + ", ROUND_CEILING - " + bigDecimal.setScale(2, BigDecimal.ROUND_CEILING) + ", ROUND_HALF_UP - " + bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP));
        });

        list = list.stream()
                .map(bigDecimal -> bigDecimal.setScale(2, BigDecimal.ROUND_CEILING)).collect(Collectors.toList());

        final BigDecimal reduce = list.stream().reduce(BigDecimal.ZERO, BigDecimal::add);

        System.out.println("Addition " + reduce);

        // This is the error.
        final BigDecimal difference = BigDecimal.valueOf(100).subtract(reduce);

        System.out.println("Difference - " + difference);
    }


这取决于,您希望如何牺牲成员的精确性。 为了一次完成,并将错误分散到各个成员,我将收集每个成员的舍入/删除部分并保持舍入和,而不是在舍入之前将前一个成员的舍入增量添加到下一个成员。最后一个成员必须这样计算:100-上一个成员的总和-已四舍五入到2位

私有静态void scaleAndPrintListList列表{ BigDecimal总和=BigDecimal.valueOf0; BigDecimal delta=BigDecimal.valueOf0;
forint i=0;我对解决方案有很多期待。我从来没有考虑过这个差异。我尝试了以下场景:``BigDecimal no1=BigDecimal.valueOf60.33334;BigDecimal no2=BigDecimal.valueOf40.38989;此场景的结果如下:数字60.33334=>60.33 diff:0.00334最后一个数字40.38989=>39.67 diff:0.71989ual差为-0.72预期结果为60和40````而不是从最后一个成员中减去。我们可以循环列表并首先减去小数点后的值。 Number 18.564474251497007 => 18.56 diff: 0.004474251497007 Number 20.954483832335328 => 20.96 diff: -0.005516167664672 Number 18.562874251497007 => 18.56 diff: 0.002874251497007 Number 19.161676646706585 => 19.16 diff: 0.001676646706585 Last Number 22.75449101796407 => 22.76 diff: -0.00550898203593