Javascript - 检查数字是否更接近2个变量

时间:2013-01-23 00:12:15

标签: javascript

我有12个不同的数字存储在变量中,如下所示:

var span1 = 8.333333333;
var span2 = 16.66666667;
var span3 = 25;
var span4 = 33.33333333;
var span5 = 41.66666667;
var span6 = 50;
var span7 = 58.33333333;
var span8 = 66.66666667;
var span9 = 75;
var span10 = 83.33333333;
var span11 = 91.66666667;
var span12 = 100;

我有一个函数,它将div的宽度与其父宽度进行比较,并以百分比(减去%符号)的形式返回一个值,例如48.5586。我想要检查结果最接近的这些跨度变量中的哪一个的函数。例如,48.5586会返回"span6",因为它接近50而不是41.666667。

真的不知道从哪一个开始,有什么想法吗?

5 个答案:

答案 0 :(得分:6)

由于每个范围比前一个范围(仅100/12多8 1/3%),您应该能够使用公式计算出您需要的范围类。

我制定了以下内容:

function spanClass(percentWidth) {
    return 'span' + Math.round(percentWidth / (100/12));
}

这为48.5586提供span6

答案 1 :(得分:3)

通过获取输入数与每个变量值之差的minimum absolute value,可以找到最小的差异。

也就是说,您应该使用适当的数据结构(如对象或数组)将这些字符串映射到数字。

答案 2 :(得分:0)

将值放在数组中,然后可以对值之间的差异对数组进行排序。最小的差异在数组中是第一个,因此这是最接近的值:

var spans = [
    { span: 1, value: 8.333333333 },
    { span: 2, value: 16.66666667 },
    { span: 3, value: 25 },
    { span: 4, value: 33.33333333 },
    { span: 5, value: 41.66666667 },
    { span: 6, value: 50 },
    { span: 7, value: 58.33333333 },
    { span: 8, value: 66.66666667 },
    { span: 9, value: 75 },
    { span: 10, value: 83.33333333 },
    { span: 11, value: 91.66666667 },
    { span: 12, value: 100 }
];

var value = 48.5586;

spans.sort(function(x, y){
    var a = Math.abs(value - x.value);
    var b = Math.abs(value - y.value);
    return a == b ? 0 : a < b ? -1 : 1;
});

alert(spans[0].span);

演示:http://jsfiddle.net/Guffa/77Rf9/

答案 3 :(得分:0)

最好有阵列。在我的代码中我也将您的变量转换为数组然后处理。 Eval很糟糕,不应该使用

http://codebins.com/bin/4ldqp6b

var span1 = 8.333333333;
var span2 = 16.66666667;
var span3 = 25;
var span4 = 33.33333333;
var span5 = 41.66666667;
var span6 = 50;
var span7 = 58.33333333;
var span8 = 66.66666667;
var span9 = 75;
var span10 = 83.33333333;
var span11 = 91.66666667;
var span12 = 100;

var arr = [];
for (var i = 0; i < 12; i++) {
    eval('arr[' + i + '] = span' + (i + 1));
}


function closestTo(arr, val) {
    var closest = 10000,
        ind = -1,
        diff = 10000; // some random number
    for (var i = 0; i < arr.length; i++) {
        var tmp = Math.abs(val - arr[i]);
        if (diff > tmp) {
            diff = tmp;
            closest = arr[i];
            ind = i;
        }
    }
    alert("Closesnt Number: " + closest + "\nClosest Index:" + ind + "\nclosest variable: span" + (ind + 1))
}

closestTo(arr, 50.12)

答案 4 :(得分:0)

在JavaScript中实现最近的函数。将所有跨度移动到一个对象中,以便更轻松地迭代它们。只需列举所有跨度并保持最接近的跨度。

var spans = {
  span1: 8.333333333,
  span2: 16.66666667,
  span3: 25,
  span4: 33.33333333,
  span5: 41.66666667,
  span6: 50,
  span7: 58.33333333,
  span8: 66.66666667,
  span9: 75,
  span10: 83.33333333,
  span11: 91.66666667,
  span12: 100
};

function closest(value) {
  var delta
    , lastMatch;

  Object.keys(spans).forEach(function (span) {
    var thisDelta;
    if (!delta) {
      lastMatch = span;
      delta = Math.abs(value - spans[span]);
    } else {
      thisDelta = Math.abs(value - spans[span]);
      if (thisDelta < delta) {
        lastMatch = span;
        delta = thisDelta;
      }
    }
  });
  return lastMatch;
}

var result = closest(48.5586);

console.log(result);

这是一个有效的Codepen示例。