Kotlin字符串转Float求和时单元测试断言失败的原因是什么
报错原因解释
根本原因:浮点数二进制存储的精度特性
- 函数内
it.toFloat()将字符串转换为32位单精度浮点数(Float),而你断言时的12.2 + 7.0 + 33.33是Kotlin默认的*64位双精度浮点数(Double)*运算结果,两类浮点数的存储精度本身存在差异。 - 十进制小数比如
12.2、33.33无法用二进制浮点数精确表示,只能存储为近似值,多次累加后误差会进一步放大,最终单精度累加得到的52.530003f就是误差累积后的结果。 isEqualTo是严格相等断言,浮点数的微小精度差会直接触发判断失败。
常见修复方案
- 统一使用
Double类型运算:将it.toFloat()改为it.toDouble(),降低精度误差的影响。 - 浮点数断言增加误差容忍范围:使用带偏移量的断言方法,比如
assertThat(result).isCloseTo(52.53, within(0.001f)),允许小范围的精度偏差。 - 高精度场景改用
BigDecimal:如果是金额等不允许精度丢失的场景,使用BigDecimal完成字符串转数字和累加操作,完全规避浮点数精度问题。
内容的提问来源于stack exchange,提问作者fweigl
相关产品推荐
相关产品推荐

