当前位置:  开发笔记 > 编程语言 > 正文

Java似乎没有比较双打正确

如何解决《Java似乎没有比较双打正确》经验,为你挑选了1个好方法。

我创建了一个链接列表,带有插入,搜索和删除功能.我还为它创建了一个迭代器.现在,假设我这样做:

myList test = new myList();
test.insert(30);
test.insert(20);
test.insert(10);
myList.iterator it = test.search(20);
if(it.hasNext())
    System.out.println(it.next());

瞧,它工作(它在节点上打印元素的值,在这种情况下为20).现在,如果我这样做:

myList test = new myList();
test.insert(30.1);
test.insert(20.1);
test.insert(10.1);
myList.iterator it = test.search(20.1);
if(it.hasNext())
    System.out.println(it.next());

它没有,因为迭代器指向null.以下是搜索功能的实现:

public iterator search(T data)
{
    no temp = first;
    while( (temp != null) && (temp.data != data) )
        temp = temp.next;
    return (new iterator(temp));
}

这是我如何知道比较中有些可疑的东西:如果我改变上面代码的一部分,如下所示:

while( (temp != null) && (temp.data != data) )
     System.out.println(temp.data + " " + data);
     temp = temp.next;

我可以看到它打印列表中的数字.它一次打印"20.1 20.1"(例如).那么我该如何解决这个问题呢?该函数似乎是正确的,但似乎Java没有正确地比较数字.

编辑:哇,BigDecimal也给了我同样的问题.

编辑2:equals()工作,没有意识到其他东西是错误的.抱歉.



1> Ari Ronen..:

请注意,使用.equals()比较双打可能会导致错误.Double.equals()使用它作为它的相等测试:

 d1.doubleValue() == d2.doubleValue()

双精度浮点数是存储在内存中固定空间中的数字的近似值.

为了正确比较浮点数,您需要注意由于浮点数的性质,会出现一些错误.

请参阅:http://www.google.com/search?q = float + point+quality

比较双打的快速简便方法是使用Math.abs(a-b) ACCEPTABLE_ERROR .000000000001取决于您的具体操作. (注意,这不处理NaN和INFINITY等边缘情况)

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有