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

整数转十进制:Kotlin代码无法正确显示数据库小数数值求助

问题解决:Kotlin代码正确显示数据库十进制数值

核心问题分析

你遇到的问题本质是整数除法截断小数:代码中duration和rate都是Long类型,执行it.duration / 1000 / 60 / 60时,所有运算都是整数除法,只要时长不足1小时,结果就会被截断为0,最终导致总和只能显示0.0这类无意义的简略值。

修正方案

1. 修正数据类型(根源性修复)

如果数据库中rate本身是十进制数值,不要用Long存储,改用Double(高精度场景用BigDecimal),避免存储阶段就丢失小数精度:

data class MSession(
    val completionTime: Date,
    val duration: Long,
    val rate: Double
) {
    constructor() : this(Date(), 0L, 0.0)
}

2. 修改运算逻辑,保留小数部分

将整数除法改为浮点除法,只需把duration转为Double后再计算,确保运算过程中保留小数:

@Composable
fun SessionContainer(sessionList: MutableList<MSession>) {
    var totalM = 0.0
    var totalMi = 0.0
    var mSessions = 0

    sessionList.forEach { session ->
        // 将时长转为小时的浮点值,避免整数截断
        val hours = session.duration.toDouble() / 1000 / 60 / 60
        val contribution = session.rate * hours

        if (session.completionTime.time < Calendar.getInstance().time.time) {
            totalM += contribution
        } else {
            totalMi += contribution
            mSessions++
        }
    }

    Column(
        Modifier
            .fillMaxWidth()
            .padding(12.dp)
    ) {
        // 格式化显示多位小数,这里保留4位,可根据需求调整
        Text(text = "Total M [%.4f]".format(totalM), fontWeight = FontWeight.Bold)
        Text(text = "Total Mi [%.4f] in total $mSessions sessions".format(totalMi), fontWeight = FontWeight.Bold)
    }
}

特殊情况处理(如果rate必须用Long)

如果rate在数据库中是整数但代表十进制(比如1234对应12.34),需要手动转换为浮点值:

// 假设rate存储的是放大100倍的整数,转换时除以100
val actualRate = session.rate.toDouble() / 100
val contribution = actualRate * hours

关键说明

  • 浮点运算用Double替代Float,精度更高,避免累积误差;
  • 用String.format指定小数位数,确保显示完整的十进制数值,而非默认的简略格式;
  • 若涉及金额、高精度计量场景,建议用BigDecimal处理,避免浮点精度丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 08:23:55