我正在开发一个项目,需要实现一个名为 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.
如果输入“格式错误”,该函数应按照以下逻辑示例返回转换后的结果:
如果输入值是“非数字”或等于 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
我会利用科学符号来快速得到我的系数和指数。
然后只处理像
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