加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

在Java中,如何测试“Double”列表是否包含特定值

发布时间:2020-12-15 01:02:42 所属栏目:Java 来源:网络整理
导读:背景:浮点数具有舍入问题,因此不应将它们与“==”进行比较. 问题:在Java中,如何测试Double列表是否包含特定值.我知道各种解决方法,但我正在寻找最优雅的解决方案,可能是使用Java或第三方库功能的解决方案. import java.util.ArrayList;import java.util.Li
背景:浮点数具有舍入问题,因此不应将它们与“==”进行比较.

问题:在Java中,如何测试Double列表是否包含特定值.我知道各种解决方法,但我正在寻找最优雅的解决方案,可能是使用Java或第三方库功能的解决方案.

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        // should be 1.38,but end up with 1.3800000000000001
        Double d1 = new Double(1.37 + 0.01);
        System.out.println("d1=" + d1);

        // won't be able to test the element for containment
        List<Double> list = new ArrayList<Double>();
        list.add(d1);
        System.out.println(list.contains(1.38));
    }
}

输出是:

d1=1.3800000000000001
false

谢谢.

解决方法

一般的解决方案是编写一个循环遍历列表的实用程序方法,并检查每个元素是否在目标值的某个阈值内.不过,使用 Stream#anyMatch(),我们可以在Java 8中做得更好:
list.stream().anyMatch(d -> (Math.abs(d/d1 - 1) < threshold))

请注意,我使用了建议here的相等测试.

如果你不使用Java 8,我会写一个简单的实用工具方法:

public static boolean contains(Collection<Double> collection,double key) {
    for (double d : collection) {
        if (Math.abs(d/key - 1) < threshold)
            return true;
    }
    return false;
}

请注意,您可能需要为这两种方法添加一个特殊情况,以检查列表是否包含0(或使用abs(x-y)< eps方法).那只是添加|| (abs(x)< eps&& abs(y)< eps)到相等条件的结束.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读