我想清理一整个过于精确数字的大型JSON。
给定具有大量小数和大变化的数字,例如:
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个有意义数字的同时简化此列表的数量(在最大值上对齐)?
答案 0 :(得分:1)
大量修改
这个功能会做你想要的:
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;
}
}
}
它返回您想要的第一个数字的位置,0表示点本身。
以下是我跑的一些测试:
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
答案 1 :(得分:0)
请参阅this fiddle。
// create our list:
var width = 984.4523354645713,
height = 003.87549531298341238;
// pick the biggest:
var max = Math.abs( Math.max( width, height) );
// How many digits we keep ?
if ( max < 10000&& max >= 1000 ) { digits = 0; }
else if ( max < 1000 && max >= 100 ) { digits = 1; }
else if ( max < 100 && max >= 10 ) { digits = 2; }
else if ( max < 10 && max >= 1 ) { digits = 3; }
else if ( max < 1 && max >= 0.1 ) { digits = 4; }
else if ( max < 0.1 && max >= 0.01 ) { digits = 5; }
else if ( max < 0.01 && max >= 0.001){ digits = 6; };
// Simplify accordingly:
console.log("w: " + width + ", h: "+ height +", w_(rounded): "+ width.toFixed(digits) +", and h_(rounded): " + height.toFixed(digits) );
INPUT:
w: 984.4523354645713,
h: 003.87549531298341238;
OUTPUT(很好地对齐!):
w_(rounded): 984.5,
h_(rounded): 3.9;