You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中计算BigDecimal总和遇类型不匹配错误,求解决方案

问题分析与解决方案

错误原因

  • 你定义的result是List<List<Any>>类型,每个子列表的第三个元素(索引2)已经是BigDecimal类型,无需再调用toBigDecimal()方法,这是导致接收者类型不匹配错误的直接原因。
  • 额外注意:Data类的cost字段被定义为Int,但你赋值的是小数(如0.00000000001),这会直接导致精度丢失,必须修正字段类型。

修复方案

1. 修正Data类的cost字段类型

将cost: Int改为cost: Double,避免小数赋值给整数的精度问题:

data class Data(
  val id: Int,
  val cost: Double, // 修正为Double类型适配小数输入
  val env: String,
  val item: String
)

2. 修复总和计算代码

去掉多余的toBigDecimal()调用,同时用更简洁的sumOf替代forEach累加:

var totalCost: BigDecimal = BigDecimal.ZERO
result.forEach { totalCostData ->
    totalCost = totalCost.add(totalCostData[2] as BigDecimal)
}

3. 推荐的优化方案(类型更安全)

直接在分组时生成TotalCost对象,避免Any类型的转换风险,后续操作更清晰:

data class Data(
  val id: Int,
  val cost: Double,
  val env: String,
  val item: String
)

data class TotalCost(
  val item: String,
  val env: String,
  val cost: BigDecimal
)

val input = listOf(
  Data(id = 1, cost = 0.00000000001, env = "prod", item = "Storage"),
  Data(id = 2, cost = 0.00000000002, env = "qa", item = "Storage"),
  Data(id = 3, cost = 0.00000000003, env = "prod", item = "Storage"),

  Data(id = 4, cost = 0.00000000005, env = "qa", item = "Bandwidth"),
  Data(id = 5, cost = 0.00000000002, env = "qa", item = "Bandwidth"),
  Data(id = 6, cost = 0.00000000005, env = "prod", item = "Bandwidth"),
  Data(id = 7, cost = 0.00000000006, env = "prod", item = "Bandwidth"),
  Data(id = 8, cost = 0.00000000001, env = "prod", item = "Bandwidth"),

  Data(id = 9, cost = 0.00000000005, env = "qa", item = "vm"),
  Data(id = 10, cost = 0.00000000002, env = "uat", item = "vm"),
  Data(id = 11, cost = 0.00000000003, env = "qa", item = "vm"),
  Data(id = 12, cost = 0.00000000004, env = "prod", item = "vm"),
  Data(id = 13, cost = 0.00000000005, env = "uat", item = "vm")
)

// 直接生成类型明确的TotalCost列表
val result = input
  .groupBy { it.item to it.env }
  .map { (key, value) ->
    TotalCost(
      item = key.first,
      env = key.second,
      cost = value.sumOf { it.cost.toBigDecimal() }
    )
  }

// 计算总和,无需类型转换
val totalCost = result.sumOf { it.cost }

内容的提问来源于stack exchange,提问作者user18282672

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:02:09