作者:手机用户2602922383_687 | 来源:互联网 | 2023-10-11 00:45
我正在调用JSON.parse()来解析具有小小数的JSON字符串.解析后不保持小数的精度.例如,返回类似3.1e-7的值而不是实际的小数.如何在保持小数精度的同时在ng2中反序列
我正在调用JSON.parse()来解析具有小小数的JSON字符串.
解析后不保持小数的精度.例如,返回类似3.1e-7的值而不是实际的小数.
如何在保持小数精度的同时在ng2中反序列化JSON字符串?
UPDATE
我正在考虑从字符串中映射出值,然后在JSON.parse()之后手动将值设置为对象,但是当我将不同的小十进制数设置为属性值时,会出现相同的数字格式.那么这个问题不一定是JSON.parse()所特有的,而是一般的Javascript吗?或者JSON.parse()以某种方式以固定的方式配置属性类型?
解决方法:
一旦你通过JSON.parse传递你的JSON字符串,你就会因为the way floating point math works而失去精确度.你需要将数字存储为object designed for storing arbitrary-precision numbers,并且在解析之前你需要摆弄字符串本身.最简单的方法是使用正则表达式. JSON是一种无上下文语法,正则表达式适用于常规语法,因此警告适用:
WARNING: PARSING CFG WITH REGEX 07002
这个正则表达式应该将JSON中的数字转换为字符串:
let stringedJSON = origJSON.replace(/:\s*([-+Ee0-9.]+)/g, ': "uniqueprefix$1"');
但是我还没有对它进行过广泛的测试,如果你的密钥类似于数据,它肯定会搞砸了:42.
假设它正常工作,stringedJSON现在应该像{“foo”:“uniqueprefix0.00000017”,“bar”:“一个实际的字符串”}.您可以使用JSON.parse解析它而不会丢失精度,但uniqueprefix0.00000017不是您想要的.可以使用额外的reviver参数调用JSON.parse,该参数在返回之前转换传递给它的值.您可以使用它将数据转换回有用的形式:
let o = JSON.parse(stringedJSON, (key, value) => {
// only changing strings
if (typeof value !== 'string') return value;
// only changing number strings
if (!value.startsWith('uniqueprefix')) return value;
// chop off the prefix
value = value.slice('uniqueprefix'.length);
// pick your favorite arbitrary-precision library
return new Big(value);
});