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

何时使用BigDecimal替代double?为何示例代码输出存在差异?

何时用BigDecimal替代double,以及为什么你的代码输出不同?

Hey there! Let's break this down into two clear parts: when to use BigDecimal instead of double, and why your code produces those specific outputs.

什么时候该用BigDecimal替代double?

  • 金融/货币计算:任何涉及精确金额的场景(比如账单、转账、税费计算)绝对要用BigDecimal——一分钱的误差都可能引发大问题,double的精度丢失完全不能接受。
  • 需要精确控制小数位数和舍入规则:比如你需要固定保留两位小数,或者指定用四舍五入、截断等方式处理多余小数位,BigDecimal提供了丰富的舍入模式(比如ROUND_HALF_UP)来满足需求。
  • 避免浮点数精度丢失:当你处理的十进制小数无法用二进制浮点数精确表示时(比如0.1、0.02这类),多次运算后误差会累积,BigDecimal能精准存储和计算这些数值。

为什么你的代码输出不一样?

关于第4行的double运算问题

double是二进制浮点数类型,它的核心局限是:很多十进制小数无法被二进制浮点数精确存储,只能存储一个近似值。
比如:

  • 0.02在二进制中是一个无限循环的小数,double只能存它的近似值
  • 0.03同理,也是一个近似值
    当你执行b - a时,两个近似值相减,误差就被放大显现出来,所以得到的结果是0.009999999999999998,而不是精确的0.01。

关于第8行的BigDecimal运算问题

当你用new BigDecimal("0.02")和new BigDecimal("0.03")构造对象时,BigDecimal是基于十进制字符串来解析数值的,它能精准表示这些十进制小数,不存在近似存储的问题。所以执行_b.subtract(_a)时,得到的就是精确的0.01,输出自然符合预期。

⚠️ 小提醒:别用new BigDecimal(double)的方式构造对象!因为如果传入的是double的近似值,BigDecimal会保留这个误差。如果一定要从double转,用BigDecimal.valueOf(double),它会把double转成对应的十进制字符串再构建对象,避免精度问题。

内容的提问来源于stack exchange,提问作者neha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:32:46