如何在JSON stringify中减少数字的重要性

时间:2012-02-18 08:45:48

标签: javascript json number-formatting

我有一个带数字(坐标)的数组,我想显示那些使用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}]

有没有办法轻易放弃剩下的微不足道的数字?

5 个答案:

答案 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#toPrecisionNumber#toFixed,以更适合您的需求为准。不同之处在于toFixed设置小数点后的位数,toPrecision设置整个位数。

var foo = 1.98765432; 
console.log(foo.toPrecision(5)); // 1.9877

请注意,toFixedtoPrecision会返回字符串,因此您可能希望在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的倍数),然后将它们转换为输出。