如何用java.math.BigDecimal区分零与负零?能否区分new BigDecimal(-0D)与new BigDecimal(0D)?
区分Java BigDecimal中的零与负零,以及
new BigDecimal(-0D)和new BigDecimal(0D)的实例差异 嘿,这个问题问到点子上了,很多开发者可能没注意到BigDecimal居然还区分正负零,我来给你拆解清楚:
一、如何区分BigDecimal的零与负零
BigDecimal内部不仅存储数值,还保留了符号信息——哪怕数值是0,符号位也可能是负的。要区分它们,可以用这几个方法:
signum()方法:这是最直接的方式,该方法返回值为:1:表示正数值0:表示零(正零)-1:表示负数值(包括负零)
示例代码:
BigDecimal posZero = new BigDecimal("0"); BigDecimal negZero = new BigDecimal("-0"); System.out.println(posZero.signum()); // 输出 0 System.out.println(negZero.signum()); // 输出 -1equals()方法:BigDecimal的equals()会同时比较数值和符号,所以正零和负零调用equals()会返回false:System.out.println(posZero.equals(negZero)); // 输出 false注意:和
compareTo()区分开,compareTo()只比较数值大小,所以正零和负零比较会返回0(表示数值相等)。字符串输出:调用
toString()或toPlainString()时,负零会显示为"-0",正零则是"0",一眼就能看出来差异。
二、能否区分new BigDecimal(-0D)和new BigDecimal(0D)创建的实例
完全可以区分!当你用double类型的-0.0和0.0构造BigDecimal时,它会保留原始double的符号信息。
看这段测试代码:
BigDecimal fromNegDouble = new BigDecimal(-0.0); BigDecimal fromPosDouble = new BigDecimal(0.0); // 用signum()区分 System.out.println(fromNegDouble.signum()); // 输出 -1 System.out.println(fromPosDouble.signum()); // 输出 0 // 用equals()区分 System.out.println(fromNegDouble.equals(fromPosDouble)); // 输出 false // 看字符串表现 System.out.println(fromNegDouble.toString()); // 输出 "-0" System.out.println(fromPosDouble.toString()); // 输出 "0"
不过要注意:虽然这两个实例符号不同,但数值上是等价的,所以compareTo()方法会返回0,表示它们的数值大小相等。
额外提醒
BigDecimal.ZERO是预定义的正零实例,signum()返回0。- 对负零进行运算时,符号可能会发生变化:比如负零乘以-1会得到正零,负零加上正数会直接得到正的数值。
内容的提问来源于stack exchange,提问作者Guillaume Massé
相关产品推荐
相关产品推荐

