Javascript 基于大小的舍入数和变化系数(数学/算法问题)

Javascript 基于大小的舍入数和变化系数(数学/算法问题),javascript,algorithm,math,rounding,hammer.js,Javascript,Algorithm,Math,Rounding,Hammer.js,我目前正在编写一个工具,允许用户通过挤压屏幕来更改值。我使用Hammer.js捕捉夹点事件,并使用事件的scale属性来确定要更改值的因子 以下代码说明了如何根据夹点增加和减少值: var value = 10; var scale = false; var previous_scale = false; pinch.on("pinch", function(e){ // Only proceed is it is not the final touch // The fina

我目前正在编写一个工具,允许用户通过挤压屏幕来更改值。我使用Hammer.js捕捉夹点事件,并使用事件的
scale
属性来确定要更改值的因子

以下代码说明了如何根据夹点增加和减少值:

var value = 10;
var scale = false;
var previous_scale = false;

pinch.on("pinch", function(e){
    // Only proceed is it is not the final touch
    // The final touch has a scale of (0)
    if(e.isFinal===false){
        // Only proceed if the previous scale has been defined
        if(previous_scale!==false){
            // Calculate the difference in scales
            scale = e.scale-previous_scale;
            previous_scale = e.scale;
            if(scale>0){
                value = Math.round(value+(1+(scale*100)));
                value = value>=4000 ? 4000 : value;
            }else{
                value = Math.round(value-(1+(Math.abs(scale)*100)));
                value = value<=10 ? 10 : value;
            }
            console.log(value);
        }else{
            previous_scale = e.scale;
        }
    }
});
这不起作用,因为它只是对数字进行四舍五入,随着数字变大,我实际上需要增加因子


有人能建议最好的方法吗?

因为
标度
var已经是一个增量,这似乎非常简单:

if( value >= 2500 ) {
    value += 500 * scale;
}
else if( value >= 1000 ) {
    value += 100 * scale;
}
else if( value >= 200 ) {
    value += 50 * scale;
}
else if( value >= 60 ) {
    value += 10 * scale;
}
else if( value >= 30 ) {
    value += 5 * scale;
}
else {
    value += scale;
}

if( value < 0 ) {
    value = 0;
}
if( value >= 5000 ) {
    value = 5000;
}
如果(值>=2500){
数值+=500*刻度;
}
否则如果(值>=1000){
数值+=100*刻度;
}
否则如果(值>=200){
数值+=50*刻度;
}
否则如果(值>=60){
数值+=10*刻度;
}
否则如果(值>=30){
数值+=5*刻度;
}
否则{
数值+=刻度;
}
如果(值<0){
数值=0;
}
如果(值>=5000){
价值=5000;
}

(假设上限为
=5000)。

似乎您仍然需要舍入的数字(如果我错了,请更正我),因此,由于可能的值数量有限,您可以使用收缩事件修改的线性标度作为所需值的索引:

var value = 10;
var scale = 10;
var previous_scale = false;

pinch.on("pinch", function(e){
    // Only proceed is it is not the final touch
    // The final touch has a scale of (0)
    if(e.isFinal===false) {
    scale = Math.round(scale * e.scale);
        if ( scale < 0 ) {
            // lower bound
            value = 0;
        } else if ( scale < 31 ) {
            // 0-30 increment of 1        --> 31 values
        value = scale;
        } else if ( scale < 37 ) {
            // 35-60 increment of 5       -->  6 values
            value = 30 + (scale - 30) * 5;
        } else if ( scale < 51 ) {
            // 70-200 increment of 10     --> 14 values
            value = 60 + (scale - 36) * 10;
        } else if ( scale < 67 ) {
            // 250-1000 increment of 50   --> 16 values
            value = 200 + (scale - 50) * 50;
        } else if ( scale < 82 ) {        
            // 1100-2500 increment of 100 --> 15 values
            value = 1000 + (scale - 66) * 100;
        } else if ( scale < 87 ) {
            // 3000-5000 increment of 500 -->  5 values
            value = 2500 + (scale - 81) * 500;
        } else {
            // higher limit 
            value = 5000;
        }
        console.log(value);
    }
});
var值=10;
var量表=10;
var-previous_scale=假;
按压打开(“按压”,功能(e){
//只有继续,这不是最后的接触
//最终触摸的刻度为(0)
如果(e.isFinal==false){
刻度=数学圆(刻度*e.scale);
如果(刻度<0){
//下限
数值=0;
}否则如果(刻度<31){
//1-->31值的0-30增量
数值=刻度;
}否则如果(刻度<37){
//5-->6个值的35-60增量
数值=30+(刻度-30)*5;
}否则如果(刻度<51){
//10-->14个值的70-200增量
数值=60+(刻度-36)*10;
}否则如果(刻度<67){
//50-->16个值的250-1000增量
数值=200+(刻度-50)*50;
}如果(标度<82){
//100-->15个值的1100-2500增量
数值=1000+(刻度-66)*100;
}否则,如果(刻度<87){
//500-->5个值的3000-5000增量
数值=2500+(刻度-81)*500;
}否则{
//上限
价值=5000;
}
console.log(值);
}
});
请告诉我这是否与你的想法相近

var value = 10;
var scale = 10;
var previous_scale = false;

pinch.on("pinch", function(e){
    // Only proceed is it is not the final touch
    // The final touch has a scale of (0)
    if(e.isFinal===false) {
    scale = Math.round(scale * e.scale);
        if ( scale < 0 ) {
            // lower bound
            value = 0;
        } else if ( scale < 31 ) {
            // 0-30 increment of 1        --> 31 values
        value = scale;
        } else if ( scale < 37 ) {
            // 35-60 increment of 5       -->  6 values
            value = 30 + (scale - 30) * 5;
        } else if ( scale < 51 ) {
            // 70-200 increment of 10     --> 14 values
            value = 60 + (scale - 36) * 10;
        } else if ( scale < 67 ) {
            // 250-1000 increment of 50   --> 16 values
            value = 200 + (scale - 50) * 50;
        } else if ( scale < 82 ) {        
            // 1100-2500 increment of 100 --> 15 values
            value = 1000 + (scale - 66) * 100;
        } else if ( scale < 87 ) {
            // 3000-5000 increment of 500 -->  5 values
            value = 2500 + (scale - 81) * 500;
        } else {
            // higher limit 
            value = 5000;
        }
        console.log(value);
    }
});