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
相关产品推荐
相关产品推荐

