weixin_45591300
繁华过后々曲终人散丶
采纳率0%
2020-11-08 16:06

求一个算法,,,返回一个数组中,比较接近比较数字的值,

求一个算法,,,返回一个数组中,比较接近比较数字的值,

补充 :
1,如果数组中有与比较数字相等的,则返回相等的值.
2,如果没有相等的,寻找最相近的值,
3,如果有2个相近度一样的返回比较大的.

例如: 数组中存值 {1.0,1.3,1.5,1.8,1.9}
如果比较数字为 1.0 那么返回1.0 (符合第一个条件)
如果比较数字为 1.1 那么返回1,0 (符合第二个条件,返回最相近的1.0)
如果比较数字为 1.4 那么返回1.3 (符合第三个条件,1.4与1.3和1.5的相近度相同,都是0.1,这时取比较大的值1.3 )

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • qq_41458550 EatingSoilLang 6月前

    给你代码,有注释,但是double类型运算会存在误差,比如数组里有1.3和1.5。你要找离1.4最近的,按你的要求应该返回1.5,实际上会给你返回1.3。

     /**
         *
         * @param doubles 从doubles数组查找
         * @param dNum 参考的数值
         * @return
         */
        public static Double findNum(double[] doubles,double dNum){
            //doubles数组可能是无序的,所以第一步先排序
            Arrays.sort(doubles);
            //先判断第一个是否就比dNum大或者相等,如果第一个就比dNum大,肯定第一个就离得最近了
            if (doubles[0]>dNum||doubles[0]==dNum){
                return doubles[0];
            }
            //同理,判断最后一个是否比dNum小或者相等,如果最后一个比dNum还小,肯定最后一个离得最近了
            if (doubles[doubles.length-1]<dNum||doubles[doubles.length-1]==dNum){
                return doubles[doubles.length-1];
            }
            //如果不是前两种特殊的,则挨个比较。
            for (int i = 0;i<doubles.length;i++){
                if (doubles[i]==dNum||doubles[i]>dNum){
                    //如果第一此出现和dnum相等或者大于dNum的数就停止循环。说明找到了最近的一个数。
                    //判断一下是否相等,相等则返回,如果不相等则判断跟前一个元素差多少,跟后边一个元素差多少,找到最近的。
                    if (doubles[i]==dNum){
                        return doubles[i];
                    }else {
                        double d1 = doubles[i]-dNum;
                        double d2 = dNum-doubles[i-1];
                        //哪个小哪个就离得近。如果相等则返回大的那个。
                        if (d1<=d2){
                            return doubles[i];
                        }else {
                            return doubles[i-1];
                        }
                    }
                }
            }
            return null;
        }

     

    点赞 评论 复制链接分享

相关推荐