Javascript JS:如何在保持n个有意义的数字的同时简化列表的精确数字?
我想清理一个大JSON,里面满是超精确的数字 给定的数字既有大量的小数,又有很大的可变性,例如:Javascript JS:如何在保持n个有意义的数字的同时简化列表的精确数字?,javascript,math,Javascript,Math,我想清理一个大JSON,里面满是超精确的数字 给定的数字既有大量的小数,又有很大的可变性,例如: set 1: w: 984.4523354645713, h: 003.87549531298341238; set 2: x: 0.00023474987546783901386284892, y: 0.000004531457539283543; 考虑到我想简化它们,并以相同的精度存储它们,让我们假设4个有意义的数字,在最大值上对齐 我想要这样的东西: set 1: w: 984.5, h
set 1:
w: 984.4523354645713,
h: 003.87549531298341238;
set 2:
x: 0.00023474987546783901386284892,
y: 0.000004531457539283543;
考虑到我想简化它们,并以相同的精度存储它们,让我们假设4个有意义的数字,在最大值上对齐
我想要这样的东西:
set 1:
w: 984.5,
h: 003.9;
set 2:
x: 0.0002347,
y: 0.0000045;
为了我所有的数百套和数千个数字
如何简化此列表中的数字,同时保持n个有意义的数字(按最大数字对齐)?请参阅
输出(精确对齐!):
w: 984.4523354645713,
h: 003.87549531298341238;
w_(rounded): 984.5,
h_(rounded): 3.9;
大规模编辑 此函数将执行您想要的操作:
function get_meaningful_digit_pos(digits, val1, val2) {
var max = Math.max.apply(null, [val1, val2].map(function(n) {
return Math.abs(n);
})),
digit = Math.pow(10, digits),
index = 0;
// For positive numbers, check how many numbers there are
// before the dot, then return the negative digits left.
if (max > 0) {
while (digit > 1) {
if (max >= digit) {
return -digits;
}
digits--;
digit /= 10;
}
}
// Loop 15 times at max; after that in JavaScript a double
// loses its precision.
for (; index < 15 - digits; index++) {
if (0 + max.toFixed(index) !== 0) {
return index + digits;
}
}
}
003.87549531298341238
是否会四舍五入到3.9
?是的!打字错误!好的,另一个问题,数字能大于1000吗?如果是这样的话,数字会发生什么变化?注意:您的方法类似于.toFixed(3)
。我的问题更多的是让不同的数字集合与集合中最大的一个保持一致,然后也会问一个If
循环。@Hugolpz对不起,我不完全理解你到底在问什么。你所说的“与最大的一组对齐”是什么意思?你是说你想首先获取JSON数据的最大价值吗?我重新编辑了这个问题。这基本上是一种数据必须简化的情况。每行应保留4个有意义的数字,以最大的项目为基础。@broxier:我已经有了一个解决方案,但它总是很有趣,并以其他方式来实现。@Hugolpz这花了一些时间,但很有趣!我重写了我的全部答案,希望这能有所帮助。:)
function get_meaningful_digit_pos(digits, val1, val2) {
var max = Math.max.apply(null, [val1, val2].map(function(n) {
return Math.abs(n);
})),
digit = Math.pow(10, digits),
index = 0;
// For positive numbers, check how many numbers there are
// before the dot, then return the negative digits left.
if (max > 0) {
while (digit > 1) {
if (max >= digit) {
return -digits;
}
digits--;
digit /= 10;
}
}
// Loop 15 times at max; after that in JavaScript a double
// loses its precision.
for (; index < 15 - digits; index++) {
if (0 + max.toFixed(index) !== 0) {
return index + digits;
}
}
}
get_meaningful_digit_pos(4, 1234, 0.0); // -3
get_meaningful_digit_pos(4, 12.000001234, 0.0); // -1
get_meaningful_digit_pos(4, 1.234, 0.0); // 0
get_meaningful_digit_pos(4, 0.1234, 1.0); // 0
get_meaningful_digit_pos(4, 0.0000001234, 0.0); // 7
get_meaningful_digit_pos(4, 0.0000001234, 10.0); // -1