JS智能舍入小数。

5
我正在寻找一些算法来“智能”地舍入小数。例如:有一个包含以下值的数组:
0: 4.0236180709235
1: 4.02462309509067
2: 4.02412058061092
.
.
17: 4.01599998414516
18: 4.01599998414516
19: 4.01949998319149
如果我查看这个数组,我可以看到这些数字在小数点后的 .000 位置上大多不同,因此应该返回 -> 3 (我随后会使用 .toFixed(3))。
可能我应该计算数组的最大值和最小值之间的差异,并从中获得最佳的小数位数。

或者循环那个数组...
第二个例子:
0: 4.0236180709235
1: 4.01462309509067
2: 4.03412058061092
.
.
17: 4.05599998414516
18: 4.06599998414516
19: 4.09949998319149
在这里,我可以看到应该将小数点后的数字舍入到第二位。

谢谢!
2个回答

4

您可以计算最大值和最小值之间的差值,并通过取以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]));


非常不错,我可以找到用途! - Beyers

2
抱歉,我还不能添加评论,所以我像这样回答。 我将该函数更改为:
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));
}

结果看起来很好。
谢谢!

我更改的原因是,当我有更多数据并且最大值和最小值之间的差异很大时,它返回较小/不好的小数。使用这个方法就像我需要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接