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

如何用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());   // 输出 -1
    
  • equals()方法: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é

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:27:37