何时使用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
相关产品推荐
相关产品推荐

