整数转十进制: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
相关产品推荐
相关产品推荐

