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

Kotlin乘法运算结果错误,删除.toBigDecimal()仍异常如何修复?

问题原因

核心为二进制浮点数精度丢失,叠加BigDecimal错误初始化导致结果不符合预期:

  • 原生Double/Float为二进制浮点数类型,无法精确表示所有十进制小数,直接使用这类类型做乘法运算天然存在精度误差。
  • 若直接对Double类型的变量调用.toBigDecimal(),本质是将已经丢失精度的Double值转为BigDecimal,精度问题已经提前产生,因此即便使用BigDecimal也无法得到正确结果。

修复方案

将参与计算的数值先转换为字符串再初始化BigDecimal,之后执行乘法运算即可,代码示例如下:

import java.math.RoundingMode

fun main() {
    // 以字符串格式传入参与计算的数值初始化BigDecimal
    val factor1 = "14223.57".toBigDecimal()
    val factor2 = "4858.37".toBigDecimal()
    val calculateResult = factor1.multiply(factor2)
    // 按需求保留2位小数,采用四舍五入模式
    val finalResult = calculateResult.setScale(2, RoundingMode.HALF_UP)
    println(finalResult) // 输出结果:69103085.89
}

注意事项

  • 所有涉及金额、对精度要求高的十进制计算场景,必须使用BigDecimal实现,禁止直接用Double/Float执行运算。
  • 初始化BigDecimal时必须传入字符串格式的数值,禁止直接传入Double类型数值或者对Double变量调用.toBigDecimal()。
  • 计算完成后需明确指定保留的小数位数和舍入模式,避免出现多余小数位或者不符合预期的舍入结果。

内容的提问来源于stack exchange,提问作者Dwi Teguh Prasetyo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:24:03