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
相关产品推荐
相关产品推荐

