【发布时间】:2017-04-05 12:16:19
【问题描述】:
给定以下字符串数组:
["9", "3", "3", "3", "8", "5", "2", "7", "0", "2", "2", "2", "7", "9", "8", "7"]
我已经编写了这个 reduce 代码,试图将数组转换为数字(不使用任何内置解析器)。
d.reduce((res,n,idx)=>{
res *= 10;
res += n.charCodeAt(0) - 48;
console.log(res);
return res;
},0);
这是日志:
9
93
933
9333
93338
933385
9333852
93338527
933385270
9333852702
93338527022
933385270222
9333852702227
93338527022279
933385270222798
9333852702227988
933385270222798(8)
我注意到9333852702227980 + 7 = 9333852702227988
当数字很大时,代码就会消失,我猜我超出了安全的整数范围。我该如何解决这个问题?
【问题讨论】:
-
如您所料,您已经超出了
Number.MAX_SAFE_INTEGER的范围,即9007199254740991或(2**53)-1,因此您正在失去精度。 -
var num = nums.reduce((p,c) => 10*p + +c);但正如@squint 所述,如果总和超过最大安全整数限制,则结果不再安全。 -
那么,是否可以在 JS 中解析更大的 MAX_SAFE_INTEGER 数字?
-
我不确定您想要实现什么。你一定需要一个数字而不是一个字符串吗?您认为什么是“内置解析器”?
-
@RoniGadot - 如果你想保持在 JavaScript 原生类型中,那么不,你总是会失去精度。但是有许多任意精度的整数包可用。你要么必须使用一个,要么设计一个。
标签: javascript arrays reduce parseint