javascript 递增/递减

问题描述 投票:0回答:1

我正在开发一个项目,需要实现一个名为 magic_inc 的函数,该函数根据特定逻辑递增或递减给定值。此函数的目标是将自定义的递增或递减序列应用于输入值。顺序如下:

对于增量(模式“inc”):

0.5 > 0.6 > 0.7 > 0.8 > 0.9 > 1 > 2 > 3 > 4 > 5 > 6 > 7 > 8 > 9 > 10 > 20 > 30 > 40 > 50 > 60 > 70 > 80 > 90 > 100 > 200 > 300 > 400 > etc.

对于递减(模式“dec”):

0.5 > 0.4 > 0.3 > 0.2 > 0.1 > 0.09 > 0.08 > 0.07 > 0.06 > 0.05 > 0.04 > 0.03 > 0.02 > 0.01 > 0.009 > 0.008 > 0.007 > 0.006 > 0.005 > etc.

该函数还应该处理负值。例如,对于模式“inc”:

inc : -0.3 > -0.2 > -0.1 > -0.09 > -0.08 > -0.07 > etc. 

对于模式“dec”:

dec : -0.7 > -0.8 > -0.9 > -1 > -2 > -3 > -4 > -5 > etc. 

如果输入“格式错误”,该函数应按照以下逻辑示例返回转换后的结果:

  • inc : 22 > 30 > 40 > 等等
  • 增量:0.76 > 0.8 > 0.9 > 等等
  • 公司:-0.5264523 > -0.4 > -0.3 > 等等
  • 公司:1568.548 > 2000 > 3000 > 等等
  • 十二月:17 > 9 > 8 > 等等
  • 十二月:0.27 > 0.1 > 0.09 > 等等
  • 十二月:-18 > -20 > -30 > 等等
  • 十二月:2.3257 > 1 > 0.9 > 等等

如果输入值是“非数字”或等于 0,则函数应返回 0。我正在努力想出一个有效的解决方案,可以不受任何限制地处理非常大和非常小的数字。我将不胜感激任何可以帮助我实现这一目标的指导或代码示例。

function magic_inc(value, mode) {
  if (typeof value !== 'number' || value === 0) {
    return 0;
  }

  const multiplier = value < 0 ? -1 : 1;
  value = Math.abs(value);
  const increments = {
    inc: [0.5, 0.6, 0.7, 0.8, 0.9],


    dec: [0.5, 0.4, 0.3, 0.2, 0.1]
  };

  for (const increment of increments[mode]) {
    if (value < increment) {
      return multiplier * increment;
    }
  }

  const power = Math.floor(Math.log10(value));
  const first_digit = Math.floor(value / 10 ** power);

  let result;
  if (mode === 'inc') {
    result = (first_digit + 1) * 10 ** power;
  } else {
    result = first_digit * 10 ** power;
  }

  return multiplier * result;

}

console.log(magic_inc(0.5, 'inc')); // Output: 0.6
console.log(magic_inc(-0.3, 'inc')); // Output: -0.2
console.log(magic_inc(1568.548, 'inc')); // Output: 2000
console.log(magic_inc(17, 'dec')); // Output: 9

正确的输出==>

console.log(magic_inc(0.5, 'inc')); // 输出:0.6
console.log(magic_inc(-0.3, 'inc')); // 输出:-0.2
console.log(magic_inc(1568.548, 'inc')); // 输出:2000
console.log(magic_inc(17, 'dec')); // 输出:9

但我得到的是 ==> 0.6 -0.5 2000 10

javascript function func
1个回答
0
投票

我会利用科学符号来快速得到我的系数和指数。

然后只处理像

1 -> 0.9
-0.9 -> -1
这样的特殊情况:

function magic_inc(value, mode) {
  if (typeof value !== 'number' || value === 0) {
    return 0;
  }

  let [a,b] = value.toExponential().toLowerCase().split("e");
  a = parseInt(a, 10);
  
  if(mode === "inc") a = a===-1 ? -.9 : a+1;
  if(mode === "dec") a = a===1 ? .9 : a-1;
  
  return +`${a}e${b}`;
}

console.log(magic_inc(0.5, 'inc')); // Output: 0.6
console.log(magic_inc(-0.3, 'inc')); // Output: -0.2
console.log(magic_inc(1568.548, 'inc')); // Output: 2000
console.log(magic_inc(17, 'dec')); // Output: 9

© www.soinside.com 2019 - 2024. All rights reserved.