Realm数据库Double字段相加导致精度丢失问题

544 阅读1分钟

realm 中设置double时。如果使用数据库自带的realm自动sum方法相加导致精度的丢失

  • 需要相加的数据库的值
    pic1
如:
4.850 * 151.400 = 734.290
4.950 * 297.700 = 1473.615

期望结果 = 2207.905
实际结果 = 2207.9049999999997

保留小数两位并四舍五入<2207.91与2207.90>导致 0.1的差距。

pic2
pic3

  • 解决方法
  1. 将double转为BigDecimal 在将其相加<亲测有效>


val lists = realm.where(ABC::class.java)
                        .equalTo("AAA", "xxx")
                        .findAll()
lists?.apply {
 // totalPrice = sum("totalPrice").toDouble().toBigDecimal() //  错误->精度丢失问题
    totalPrice = sumByBigDecimal {it.totalPrice?.toBigDecimal() ?: BigDecimal.ZERO}
}                        

// 内联函数
inline fun <T> Collection<T>.sumByBigDecimal(selector: (T) -> BigDecimal): BigDecimal {
    var sum: BigDecimal = BigDecimal.ZERO
    for (element in this) {
        sum += selector(element)
    }
    return sum
}
  1. 将数据库中额double(需要相加的)使用BigDecimal替换<理论可行> -->(注意Realm数据库迁移)