javascript, parseInt 结果与原字符串不符

2016-04-09 22:42:33 +08:00
 hayao650

今天加班,配合前端工作,前端有一个奇怪的问题,有一个数据从后端取出来后,在随后的接口传给后端,但是这个数据,不知道怎么被改变了,我调试了一下,发现是 parseInt 之后,数据变了,但是我不知道为什么,所以来问一下,有没有兄弟清楚

        var s = "62201604091700693";
        alert(parseInt(s,10));

alert 出来的数据变成 62201604091700696

2957 次点击
所在节点    JavaScript
14 条回复
yyfearth
2016-04-09 22:51:47 +08:00
看样子 貌似太长了?
hayao650
2016-04-09 22:57:57 +08:00
@yyfearth 应该不是太长了, javascript 的 number 支持很长很长,而且换成 62201604091700700 这种都没问题的
yxzblue
2016-04-09 22:58:31 +08:00
楼主的这个数字字符串大于 Number.MAX_SAFE_INTEGER 。

参考链接:<https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER>。

怎么解决等楼下的高人吧...
Exceptionluo
2016-04-09 23:03:13 +08:00
超出了 JS 的安全值范围
hayao650
2016-04-09 23:07:23 +08:00
@Exceptionluo
@yxzblue
了解了,谢谢兄弟
magicdawn
2016-04-09 23:14:23 +08:00
你的串是 56 位的, IEEE-754 安全值是 2^53 - 1, 怎么解决,拆开表示,或者找找 bigint 库,里面应该也是拆开表示
hayao650
2016-04-09 23:20:03 +08:00
@magicdawn 谢谢
ileenhow
2016-04-09 23:22:28 +08:00
SoloCompany
2016-04-10 06:03:04 +08:00
js 在设计上对整数运算是有天然缺陷的
因为为了简单它标准规范里面所有数字都是双精度浮点数
假如它能支持 64bit 整数的话,十进制至少 18 位是没有问题的
有整数运算要求的可以用 jsbn.js
这个库很小,用了做 rsa 什么的都是 ok 的
v2survive
2016-04-10 08:21:08 +08:00
还要传给后端而前端自己不用这个数字的话,再传到后端的时候可以考虑还是传 string
hayao650
2016-04-10 10:57:31 +08:00
@v2survive 不知道他们为什么用 int ,前端后端都不是我写的,我只是加班无聊的时候帮着看看
hayao650
2016-04-10 10:58:11 +08:00
@SoloCompany 好的,标记一下,学习学习
hayao650
2016-04-10 10:58:32 +08:00
@ileenhow 谢了兄弟
xieguanglei
2016-04-14 19:13:39 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/269852

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX