我对使用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()”是否可以保证为true吗?
他们什么时候会得出错误的结论?当涉及算术运算时,这是吗?
谢谢
最佳答案
通常,==
是用于检查是否相等的运算符。对象变量是引用,因此它检查引用或地址是否相等。对于表示内存中值的原始数据类型,这也意味着它检查值的相等性。
方法equals(~)
检查值或内容是否相等。您不将其用于原始数据类型,而是用于对象。
double和Double也是如此。由双精度引起的问题是由舍入误差引起的值的不匹配。
一些算术运算可能会以不同的方式处理舍入,因此即使您认为应该相等,也可能会得到false
以获取值相等性。
应该指出,即使舍入规则有点不一致,算术运算也是确定的,这样就可以处理不一致的情况。