Man*_*ani 35 java precision double bigdecimal zero
一些有趣的观察wrt等于0和0.0上的运算符
new Double(0.0).equals(0)返回false,同时new Double(0.0).equals(0.0)返回true.
BigDecimal.ZERO.equals(BigDecimal.valueOf(0.0))返回false,同时BigDecimal.ZERO.equals(BigDecimal.valueOf(0))返回true.
看起来在两种情况下都进行了字符串比较.任何人都可以对此有所了解.
谢谢.
ass*_*ias 66
BigDecimal'equals'比较值和比例.如果您只想比较值(0 == 0.0),您应该使用compareTo:
BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0.0)) == 0 //true
BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0)) == 0 //true
Run Code Online (Sandbox Code Playgroud)
请参阅javadoc.
对于Double比较,正如其他答案所解释的那样,您将Double与Integer in进行比较new Double(0.0).equals(0),返回false因为对象具有不同的类型.作为参考,JDK 7中equals方法的代码是:
public boolean equals(Object obj) {
return (obj instanceof Double)
&& (doubleToLongBits(((Double)obj).value) ==
doubleToLongBits(value));
}
Run Code Online (Sandbox Code Playgroud)
在你的情况下,(obj instanceof Double)是假的.
第一个表达式中的0被解释为a int,可以自动装入a Integer,但不能自动装入a Double.所以两者的类型不同,因此它们不相等.OTOH 0.0是一个double自动装入a的Double,因此两个操作数被视为相等.
BigDecimals还包含一个比例(即小数点分隔点右侧的位数).BigDecimal.ZERO值为"0",因此其比例为0.因此它不等于"0.0",其比例为1.
如果要比较值,请使用BigDecimal.compareTo:
BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0.0)) == 0
BigDecimal.ZERO.compareTo(BigDecimal.valueOf(0)) == 0
Run Code Online (Sandbox Code Playgroud)