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

