JS智能四舍五入小数

JS smart rounding small numbers

我正在寻找一些算法来 "smart" 舍入小数字。例如:
让我们用值数组:
0: 4.0236180709235
1: 4.02462309509067
2: 4.02412058061092
.
.
17: 4.01599998414516
18: 4.01599998414516
19: 4.01949998319149

如果我查看这个数组,我可以看到这个数字在 .000 位置上大部分不同,所以它应该 return -> 3(然后我在 => .toFixed(3) 中使用)

也许我应该计算数组的最大值和最小值之间的差值,并从中得到小数位的最佳数字。

或者循环那个数组...

第二个例子:
0:4.0236180709235
1: 4.01462309509067
2: 4.03412058061092
.
.
17: 4.05599998414516
18: 4.06599998414516
19: 4.09949998319149
在那里我可以看到 round 的十进制数应该是 2。

谢谢!

你可以取最大值和最小值的差值,并通过取 10 的对数来得到零的计数。然后得到一个向上舍入的正整数作为固定数字的值。

function round(array) {
    var min = Math.min(...array),
        max = Math.max(...array),
        fixed = Math.ceil(-Math.log10(max - min));

    if (fixed < 0) return array;
    return array.map(v => v.toFixed(fixed));
}

console.log(...round([4.0236180709235, 4.01949998319149]));
console.log(...round([4.0236180709235, 4.09949998319149]))
console.log(...round([100, 20000]));

抱歉,我还不能添加评论,所以我这样回答。
我将该函数更改为:

function round(array) {
var min = Math.min(...array),
    max = Math.max(...array),
    spacing = (max - min) / (max - 1),
    fixed = Math.ceil(-Math.log10(spacing));

if (fixed < 0) return array;
return array.map(v => v.toFixed(fixed));
}

结果看起来不错。
谢谢!

我之所以改变它,是因为当我有更多数据时,最大值和最小值之间的差异很高,它的 return 更小/错误的十进制数。有了这个就像我需要的。