Double price = 19.0000;
Double[] source = new Double[]{18.01,998.9,45.66,6.78,20.00};
// 处理
Double[] absource = new Double[source.length];
for (int i = 0; i < source.length; i++) {
absource[i]=Math.abs(source[i]-price);
}
Double[] tempAbsource = absource.clone();// 一个副本(浅复制)
Arrays.sort(absource);
Double min = absource[0];// 绝对值的最小值
// Double max = absource[absource.length-1];// 绝对值的最大值
// 如果price为12,数组中绝对值最小为1 里面有 11和13的话,找11 还是找13?
// System.out.println(min+price);// 不可以这么写
/*
* 如果有多个相同的接近值 入 12与11,11 和 12 与11,13(可能多个)
* 他们的绝对值是一样的,所以都要列出来。循环不可少
*/
for (int i = 0; i < source.length; i++) {
if(tempAbsource[i].equals(min)){
System.out.println(""+ source[i]);
}
}
如果不想用克隆方式 那最后一个for循环也可以直接这么写
for (int i = 0; i < source.length; i++) {
Double d = Math.abs(source[i]-price);
if(d.equals(min)){
System.out.println(""+ source[i]);
}
}
效果是一样的。克隆方式值需要复制一个副本,而这种方式要循环里生成很多的对象。
用JS来实现求最近值:
var arr=[26,25.01,25.01,24.99,56,67,24,35,46,57,68],s=25.00,result=[];
for(var i=0,arr1=[];i<arr.length;i++){
arr1[i]=Math.abs(arr[i]-s);
}
var minVal=Math.min.apply(null,arr1);//或者var minVal = Math.min.apply({},arr1);
for(var i=0;i<arr1.length;i++){
if (arr1[i]==minVal){
result.push(arr[i])
}
}
console.log(result+"");