我对使用double感到有些困惑。
如果我要使用相同的字面量初始化2个双打,==总是会得出true吗?例如,如果以下输出为true,但我不知道这是否是偶然的:
double a = .1d;
double b = .1d;
System.out.println(a==b);
使用Double而不是double时,我得到相同的结果:
Double a = .1d;
Double b = .1d;
System.out.println(a.equals(b));
根据Double文档,如果doubleValue()相等,则equals()返回true。
所以问题是,对于用相同文字初始化的2个变量,是否保证对double等于“ ==”而对Double等于“ equals()”?
何时将它们评估为假?是涉及算术运算的吗?
谢谢
答案 0 :(得分:1)
通常==
是检查是否相等的运算符。对象变量是引用,因此它检查引用或地址是否相等。对于表示内存中值的原始数据类型,这也意味着它会检查值是否相等。
方法equals(~)
检查值或内容是否相等。您不将它用于原始数据类型,而用于对象。
double和Double也是如此。双精度引起的问题是舍入误差引起的值不匹配。
某些算术运算可能会舍入不同的舍入,因此即使您认为应该相等,也可能获得false
来实现值相等。
应该指出,即使舍入规则有点不一致,算术运算也是确定的,这样就可以处理不一致的情况。