我有一个带数字(坐标)的数组,我想显示那些使用JSON的那些
JSON.stringify(array);
我的数组看起来像:
[{"x":-0.825,"y":0},
{"x":-1.5812500000000003,"y":-0.5625},
{"x":-2.2515625000000004,"y":-1.546875}]
但我只对第一个(比如说)4个有效数字感兴趣,即
[{"x":-0.825,"y":0},
{"x":-1.5813,"y":-0.5625},
{"x":-2.2516,"y":-1.5469}]
有没有办法轻易放弃剩下的微不足道的数字?
答案 0 :(得分:35)
Native JSON.stringify接受参数replacer
,它可以是将值转换为所需内容的函数:
a = [0.123456789123456789]
JSON.stringify(a, function(key, val) {
return val.toFixed ? Number(val.toFixed(3)) : val;
})
>> "[0.123]"
答案 1 :(得分:8)
使用Number#toPrecision
或Number#toFixed
,以更适合您的需求为准。不同之处在于toFixed
设置小数点后的位数,toPrecision
设置整个位数。
var foo = 1.98765432;
console.log(foo.toPrecision(5)); // 1.9877
请注意,toFixed
和toPrecision
会返回字符串,因此您可能希望在JSON化之前将它们转换回数字。
这是必须的MDN link。
如果你想自己动手,你也可以这样做。
Math.round(1.98765432 * 10000) / 10000 // 1.9877
封装在一个函数中,它看起来像这样:
function precisify(n, places) {
var scale = Math.pow(10, places);
return Math.round(n * scale) / scale;
}
答案 2 :(得分:3)
首先想到的是预处理数组以将所有数字四舍五入为四位数:
var array =[{"x":-0.825,"y":0},
{"x":-1.5812500000000003,"y":-0.5625},
{"x":-2.2515625000000004,"y":-1.546875}];
for (var i=0; i<array.length; i++){
array[i].x = +array[i].x.toFixed(4);
array[i].y = +array[i].y.toFixed(4);
}
var json = JSON.stringify(array);
// json === '[{"x":-0.825,"y":0},{"x":-1.5813,"y":-0.5625},{"x":-2.2516,"y":-1.5469}]'
.toFixed()
function返回一个字符串,所以我使用了一元加运算符将其转换回一个数字。
想到的第二种方法是按JSON.stringify()
处理字符串输出:
json = json.replace(/(\.\d{4})(\d+)/g,"$1");
答案 3 :(得分:1)
有点矫枉过正,但这应该适用于所有情况。
function prepareArrayForJSON(array) {
var i = 0;
while (i < array.length) {
if (typeof array[i] === 'number') {
array[i] = array[i].toPrecision(4);
} else if(typeof array[i] === 'object') {
if (array instanceof Object) {
prepareObjectForJSON(array[i]);
} else if (array instanceof Array) {
prepareArrayForJSON(array[i]);
}
}
}
}
function prepareObjectForJSON(obj) {
var i;
for (i in obj) {
if (obj.hasOwnProperty(i)) {
if (typeof obj[i] === 'number') {
obj[i] = obj[i].toPrecision(4);
} else if(typeof obj[i] === 'object') {
if (obj instanceof Object) {
prepareObjectForJSON(array[i]);
} else if (obj instanceof Array) {
prepareArrayForJSON(obj[i]);
}
}
}
}
}
享受自己
答案 4 :(得分:0)
运行数组并将以下内容应用于所有值。
value = Math.round( value * 10000 ) / 10000;
另一种可能性是将内部坐标存储为int值(10 ^ -4的倍数),然后将它们转换为输出。