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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:27:04