当前位置: 首页 > 知识库问答 >
问题:

BigDecimal汇总统计信息

宦琪
2023-03-14

我有一个BigDecimal的列表。

List<BigDecimal> amounts = new ArrayList<>()

如何使用Java8流获得上述列表的汇总统计信息,而不丢失BigDecimal的3-4位小数的精度?

共有1个答案

蒯宏达
2023-03-14

我创建了一个bigdecimal专门化,用于该答案的通用摘要统计信息收集器,它允许扩展它以支持求和,因此也可以计算平均值:

/**
 * Like {@code DoubleSummaryStatistics}, {@code IntSummaryStatistics}, and
 * {@code LongSummaryStatistics}, but for {@link BigDecimal}.
 */
public class BigDecimalSummaryStatistics implements Consumer<BigDecimal> {

    public static Collector<BigDecimal,?,BigDecimalSummaryStatistics> statistics() {
        return Collector.of(BigDecimalSummaryStatistics::new,
            BigDecimalSummaryStatistics::accept, BigDecimalSummaryStatistics::merge);
    }
    private BigDecimal sum = BigDecimal.ZERO, min, max;
    private long count;

    public void accept(BigDecimal t) {
        if(count == 0) {
            Objects.requireNonNull(t);
            count = 1;
            sum = t;
            min = t;
            max = t;
        }
        else {
            sum = sum.add(t);
            if(min.compareTo(t) > 0) min = t;
            if(max.compareTo(t) < 0) max = t;
            count++;
        }
    }
    public BigDecimalSummaryStatistics merge(BigDecimalSummaryStatistics s) {
        if(s.count > 0) {
            if(count == 0) {
                count = s.count;
                sum = s.sum;
                min = s.min;
                max = s.max;
            }
            else {
                sum = sum.add(s.sum);
                if(min.compareTo(s.min) > 0) min = s.min;
                if(max.compareTo(s.max) < 0) max = s.max;
                count += s.count;
            }
        }
        return this;
    }

    public long getCount() {
        return count;
    }

    public BigDecimal getSum()
    {
      return sum;
    }

    public BigDecimal getAverage(MathContext mc)
    {
      return count < 2? sum: sum.divide(BigDecimal.valueOf(count), mc);
    }

    public BigDecimal getMin() {
        return min;
    }

    public BigDecimal getMax() {
        return max;
    }

    @Override
    public String toString() {
        return count == 0? "empty": (count+" elements between "+min+" and "+max+", sum="+sum);
    }
}

它可以与doubleSummaryStatistics对应项类似地使用,如

BigDecimalSummaryStatistics bds = list.stream().collect(BigDecimalSummaryStatistics.statistics());

举个完整的例子:

List<BigDecimal> list = Arrays.asList(BigDecimal.ZERO, BigDecimal.valueOf(-2), BigDecimal.ONE);
BigDecimalSummaryStatistics bds = list.stream().collect(BigDecimalSummaryStatistics.statistics());
System.out.println(bds);
System.out.println("average: "+bds.getAverage(MathContext.DECIMAL128));
3 elements between -2 and 1, sum=-1
average: -0.3333333333333333333333333333333333
 类似资料:
  • 本文向大家介绍如何找到R数据帧的分组汇总统计信息?,包括了如何找到R数据帧的分组汇总统计信息?的使用技巧和注意事项,需要的朋友参考一下 为了比较不同的组,我们需要每个组的摘要统计信息。它有助于我们观察两组之间的差异。摘要统计信息提供最小值,第一四分位数,中位数,第三四分位数和最大值。因此,我们可以比较每个组的这些值。要找到R数据帧的逐组汇总统计信息,我们可以使用tapply函数。 示例 请看以下数

  • V2Ray 提供了一些关于其运行状况的统计信息。 StatsObject StatsObject 对应配置文件中的stats项。 { } 目前统计信息没有任何参数,只要StatsObject项存在,内部的统计即会开启。同时你还需要在 Policy 中开启对应的项,才可以统计对应的数据。 目前已有的统计信息如下: 用户数据 user>>>[email]>>>traffic>>>uplink 特定用

  • 我有一个相同维数的矩阵列表,例如: 我想做的是从列表中的每个矩阵中对随机列进行多次采样,例如,在给定的样本中,要采样的列索引是:

  • 我想做一个关于资源利用的统计!我知道有了'ResourcePool.Utility()'我就能做到!但问题是,资源工作,按时间表,为8小时..但统计是结束了一整天!有没有办法只在他们的工作时间内调查利用情况? 谢谢u Miriana

  • 本文向大家介绍JS倒计时代码汇总,包括了JS倒计时代码汇总的使用技巧和注意事项,需要的朋友参考一下 本文实例总结了常见的JS倒计时代码。分享给大家供大家参考。具体汇总如下: 第一种:精确到秒的javascript倒计时代码  HTML代码:  第二种:某某运动会  HTML代码:    第三种:小时倒计时  HTML代码:  第四种:最简倒计时  HTML代码:  第五种:最简倒计时二  HTML

  • 发送短信 目前仅提供系统api调用的方式发送短信。 短信功能仅支持物联网卡与平台的双向发送,第三方平台和手机卡发送短信不会送达到终端。 短信发送统计 统计包含上行总数、下行总数、网关发送成功数、终端收到数、发送失败(网关发送失败)、发送失败(终端未收到),曲线及统计详情。 短信发送明细 查询所有短信发送明细。可以根据发送时间、发送类型、状态、ICCID来筛选。