Javascript 在十进制范围内搜索

Javascript 在十进制范围内搜索,javascript,logic,Javascript,Logic,正如您所注意到的,在上述场景中,该条件永远不会成立。我想写一个逻辑,它考虑到数组内部检查范围的+/-0.01 我曾想过通过范围检查功能驱动所有阵列元素,但这太昂贵了 有什么想法吗 让我们看看我是否理解正确。 您需要定义公差: var a = {28.82:0, 28.91:0, 29.11:0, 30.11:0, 32.22:0, 32.23:0, 32.24:0}; function check(range) // range = 28.90; if (a[range]){ // do

正如您所注意到的,在上述场景中,该条件永远不会成立。我想写一个逻辑,它考虑到数组内部检查范围的+/-0.01

我曾想过通过范围检查功能驱动所有阵列元素,但这太昂贵了


有什么想法吗

让我们看看我是否理解正确。
您需要定义公差:

var a = {28.82:0, 28.91:0, 29.11:0, 30.11:0, 32.22:0, 32.23:0, 32.24:0};

function check(range) // range = 28.90;
if (a[range]){
  // do stuff here... 
}
var a=[28.82,28.91,29.11,30.11,32.22,32.23,32.24];
功能检查(范围){//range=28.90;
对于(var i=0;iif(Math.abs(a[i]-range)让我们看看我是否理解正确。
您需要定义公差:

var a = {28.82:0, 28.91:0, 29.11:0, 30.11:0, 32.22:0, 32.23:0, 32.24:0};

function check(range) // range = 28.90;
if (a[range]){
  // do stuff here... 
}
var a=[28.82,28.91,29.11,30.11,32.22,32.23,32.24];
功能检查(范围){//range=28.90;
对于(var i=0;i如果(Math.abs(a[i]-range)也许我误解了,但你不能这样做吗

var a = [28.82, 28.91, 29.11, 30.11, 32.22, 32.23, 32.24];

function check(range) { // range = 28.90;
  for (var i = 0; i < a.length; i++) {  
    if (Math.abs(a[i] - range) <= 0.01) {
      // do stuff here... 
    }
  }
}
还是你担心的方法太昂贵

请注意,如果
a[range]
处的值等于零或false,则逻辑检查
if(a[range])
将返回false。如果希望在属性存在时运行代码,则无论其值如何,都需要稍微修改条件以考虑这些边缘情况

编辑:正如@SaniHuttunen在评论中指出的,如果(a[range]!==未定义)


也许我误解了,但你不能这样做吗

var a = [28.82, 28.91, 29.11, 30.11, 32.22, 32.23, 32.24];

function check(range) { // range = 28.90;
  for (var i = 0; i < a.length; i++) {  
    if (Math.abs(a[i] - range) <= 0.01) {
      // do stuff here... 
    }
  }
}
还是你担心的方法太昂贵

请注意,如果
a[range]
处的值等于零或false,则逻辑检查
if(a[range])
将返回false。如果希望在属性存在时运行代码,则无论其值如何,都需要稍微修改条件以考虑这些边缘情况

编辑:正如@SaniHuttunen在评论中指出的,如果(a[range]!==未定义)


知道它介于哪两个元素之间会有帮助吗

function check(range){
    function propExists(key){
        return a[key] !== undefined;
    }
    if (propExists(range) || propExists(range+0.01) || propExists(range-0.01){
        // do stuff here... 
    }
}
var a=[28.82,28.91,29.11,30.11,32.22,32.23,32.24];
功能检查(arr,范围){
var匹配=[];
arr.REDUCT(功能(上、当前){

如果(prev知道它介于哪两个元素之间会有帮助吗

function check(range){
    function propExists(key){
        return a[key] !== undefined;
    }
    if (propExists(range) || propExists(range+0.01) || propExists(range-0.01){
        // do stuff here... 
    }
}
var a=[28.82,28.91,29.11,30.11,32.22,32.23,32.24];
功能检查(arr,范围){
var匹配=[];
arr.REDUCT(功能(上、当前){


如果(上一篇文章)没有办法使用一个位于某个虚拟范围内的浮点作为对象属性的键,它要么就是键,要么不是键。你必须迭代所有键,检查它们是否在你的范围内,如果这太昂贵,你必须找出其他的东西。你不能在一个O中有数字属性名JavaScript中的Object。值可以是数字。但我不知道为什么你希望每个值都是0。这些只是一些虚拟值。实际值会有所不同。你需要让问题更容易理解。没有办法使用某个虚拟范围内的浮点作为对象属性的键,它是要么就是关键点,要么不是关键点。你必须迭代所有关键点,检查它们是否在你的范围内,如果这太昂贵,你必须找出其他东西。在JavaScript中,对象中不能有数字属性名。值可以是数字的。但我不知道为什么你要每个值e为0。这些只是一些伪值。实际值会有所不同。你需要让问题更容易理解。谢谢你的回答。但这需要遍历整个对象。这会很昂贵。你一直说很昂贵,但你知道javascript操作速度吗?这是一个代表性的数据集。实际数据会d要大得多,而且这个操作会频繁发生。谢谢你的回答。但是这需要遍历整个对象。这会很昂贵。你一直说很昂贵,但你知道javascript操作速度吗?这是一个典型的数据集。实际数据会大得多,而且这个操作会频繁发生。你知道吗可以只做
a[key]!==undefined
。facepalm…好主意!但是这里有一个问题:一些值不能用双精度浮点数正确表示。例如:
28.83-0.01=28.8199999999997
。这将导致测试失败。您仍然需要一个公差。您可以做的是
Math.round((范围-0.01)*100)/100
(和
数学四舍五入((范围+0.01)*100)/100
)。这将在减法(或加法)后将值四舍五入到小数点后2位。这将减少算术精度错误。但是,这对于运算来说可能“太贵了”。您可以只做
a[键]!==未定义的
。facepalm…很好!但这里有一个问题:某些值不能用双精度浮点数正确表示。例如:
28.83-0.01=28.81999999997
。这将导致测试失败。您仍然需要一个公差。您可以做的是
数学.round((范围-0.01)*100)/100
(和
Math.round((范围+0.01)*100)/100
)。这将在减法(或加法)后将值四舍五入到小数点后2位。这将减少算术精度错误。但这可能对运算“太贵”。