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 更小/错误的十进制数。有了这个就像我需要的。
我正在寻找一些算法来 "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 更小/错误的十进制数。有了这个就像我需要的。