在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)到相等条件的结束. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- java – 在处理信息检索中面向行和面向列的数据库之间的区别
- java – 如何检查线程是否正在睡眠?
- java – 使用Hibernate Annotations注释EnumMap
- java – 检测JDialog的大小调整
- java – Swing组件的开源改进或替代
- hadoop上传文件功能实例代码
- java – 使用Tuple(double,int,int)的arraylist比两个array
- java – 如何使用@Value将属性值注入静态字段
- java – 关于classloader如何加载静态变量的说明
- java.lang.IllegalAccessException:与类的public / privat