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

为何BigDecimal(13.90)与BigDecimal("13.9")比较结果不为0?

为什么你的BigDecimal对比结果不符合预期?

这问题的核心是浮点数精度限制和BigDecimal不同构造函数的行为差异,我给你一步步理清楚:

1. 为什么new BigDecimal(13.90)和new BigDecimal("13.9")对比返回1?

首先要明白:double类型的13.90并不是一个精确的十进制值。因为二进制浮点数无法精确表示所有十进制小数,13.9在二进制中是一个无限循环的近似值,实际存储的是一个略大于13.9的数值(你可以打印b的实际值看看:System.out.println(b);,会输出类似13.9000000000000003552713678800500929355621337890625)。

而用字符串"13.9"构造BigDecimal时,它会严格按照十进制字符串的内容解析出精确的数值13.9。

所以当你调用b.compareTo(b2)时,b的实际值比b2大,自然返回1。

2. 为什么把"13.9"改成13.9后返回0?

这时候两个BigDecimal都是用double类型的13.9构造的——它们的底层值都是那个不精确的、略大于13.9的二进制近似值,所以两个对象的数值完全一致,compareTo就返回0了。

关键建议

如果需要精确处理十进制小数(比如货币计算),一定要优先使用BigDecimal的字符串构造函数,绝对避免用double作为构造参数,否则double本身的精度缺陷会直接传递到BigDecimal中,破坏你想要的精确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:59:00