【发布时间】:2017-08-25 09:18:18
【问题描述】:
import java.math.BigDecimal;
public class HelloWorld{
public static void main(String []args){
BigDecimal previousOperationAmount = new BigDecimal(1149.35);
Double requestedAmount = 1149.35;
if (requestedAmount != previousOperationAmount.doubleValue()) {
System.out.println("Hello 1");
}
if(!requestedAmount.equals(previousOperationAmount.doubleValue())) {
System.out.println("Hello 2");
}
}
}
有两种方法可以比较双精度值.. 一种是使用 != 运算符,一种是使用 .equals 运算符。我知道 .equals 是更好的比较方式。但是在这里, != 比较也没有给出任何错误。
可以使用 != 比较双值吗? != 检查双值是否具有确定性?
【问题讨论】:
-
从技术上讲,是也不是。是的,可以将
double(但不是Double,因为具有相同值的两个Double对象与Double对象不同)与!= 进行比较。但是由于double不是绝对精确的,所以您会遇到很多麻烦,例如,如果将 1.00000000000000000001 与 1.0 进行比较(这很容易发生)。因此,更好的方法包括,例如,使用Math.abs( double1 - double2 ) > eps之类的东西(对于有用的 eps)。 -
!=是确定性的,就像equals一样。你为什么不检查Double.equals的文档来找出答案? docs.oracle.com/javase/8/docs/api/java/lang/… -
@FlorianSchaetz 你的意思是
Math.abs( double1 - double2 ) <= eps在检查相等性时,对吧?否则,5.01和4.13将通过检查任何小于1.0的eps -
@Shark 因为问题是关于
!=,所以我使用了>。对于相等,正确,您应该检查<或<=eps。在这种情况下,假设 eps 为 1E-6,我们将有|5.01 - 4.13| > 1E-6,即true(因此两者在此 eps 方面不相等)。如果你想测试是否相等,你必须切换比较,true。 -
哦,别忘了这里也涉及到一些自动拆箱功能,这使整个事情更加复杂;-)
标签: java