Java8任何一个好的四舍五入算法都可以对bigdecimal进行四舍五入,并将总值返回为100
我目前正在寻找一个好的算法,将做取整,并返回总值为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。 我不确定这个算法有多好,但如果你有更好的想法,我会非常感激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进行了四舍五入。 添加所有值
@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