Javascript 在十进制范围内搜索
正如您所注意到的,在上述场景中,该条件永远不会成立。我想写一个逻辑,它考虑到数组内部检查范围的+/-0.01 我曾想过通过范围检查功能驱动所有阵列元素,但这太昂贵了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
有什么想法吗 让我们看看我是否理解正确。
您需要定义公差:
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 if(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位。这将减少算术精度错误。但这可能对运算“太贵”。