我有一个字符串:
"{0:16970861903381446063,length:1}"
我尝试使用eval
方法将其转换为对象,但它也会对字符串进行求值,从而对数值进行舍入,返回:
{0:16970861903381447000,length:1}
我尝试将数字作为字符串传递,然后在其上调用eval
,
在创建JSON字符串时使用16970861903381446063 + ''
作为值;使用typeof
进行检查会将其显示为string
类型,但它仍会将数字16970861903381446063舍入为16970861903381447000。
有没有办法可以绕过这个,或者更好的方法来做到这一点?
以下是从包含数字
的数组生成json文本的代码function simplify(arr){
request = "{";
if (arr.length ==1){
request += 0 + ":" + (arr[0] + '') + "," ;
}
else{
for (var i=0;i<=arr.length-1 ;i++){
request += i + ":" + (arr[i] + '') + ",";
}
}
request += "length" + ":" + arr.length +"}";
return request;
}
答案 0 :(得分:3)
将其用引号括起来制作一个字符串:
{
0: "16970861903381446063",
length: 1
}
我假设你只是在文档中的某个地方使用它;或者您打算将其用作实际数字?
答案 1 :(得分:3)
你正在运行IEEE双精度浮点数的精度,它使用53位作为尾数,11位作为指数。
Javascript编号,所有这些编号都由64位浮点数表示。许多语言中的浮点数由两部分表示,即尾数和指数。在Javascript中,尾数是53位,指数是11位。
当您看到数字表示为例如3.5346367e + 22时,尾数为3.5246367,指数为22。
您要存储的数字大于尾数的最大值,因此您的数字会四舍五入,而较大的数字会得到一个指数。
长话短说,除非你用这些巨大的数字进行算术运算,否则你应该将它们存储为字符串。
最后,您应该将JSON数组表示为实际的JSON数组,而不是通过定义整数键和长度属性来假装为数组的对象:
// Do this
json = '["16970861903381446063"]';
// Not this
json = '{0:"16970861903381446063", length:1}';
答案 2 :(得分:2)
听起来你需要在整个过程中保持一个字符串。但是,如果你这样做,你打算怎么做数学计算?
答案 3 :(得分:0)
好莱坞找到了一个简单的解决方案,感谢freenode的人们
function simplify(arr){
request = "{";
if (arr.length ==1){
request += ( 0 + ":" + "'" + String(arr[0])+ "'" + ",") ;
}
else{
for (var i=0;i<=arr.length-1 ;i++){
request += i + ":" + "'" + String(arr[i]) + "'" + ",";
}
}
request += "length" + ":" + arr.length +"}" ;
return request;
}
eval存在问题,即使我使用带字符串文字的数组,它们也是数字,而eval需要一些字符串,这些字符串不能被eval()编辑。
以下是在向字符串
显式添加引号后的示例输出{0:'16970861903381446063',1:'16970861903381444012',length:2}