Javascript, parseInt 结果与原字符串不符 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
hayao650
V2EX    Javascript

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

  •  
  •   hayao650 2016-04-09 22:42:33 +08:00 3611 次点击
    这是一个创建于 3550 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    alert 出来的数据变成 62201604091700696

    14 条回复    2016-04-14 19:13:39 +08:00
    yyfearth
        1
    yyfearth  
       2016-04-09 22:51:47 +08:00 via iPhone
    看样子 貌似太长了?
    hayao650
        2
    hayao650  
    OP
       2016-04-09 22:57:57 +08:00 via Android
    @yyfearth 应该不是太长了, Javascript 的 number 支持很长很长,而且换成 62201604091700700 这种都没问题的
    yxzblue
        3
    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
        4
    Exceptionluo  
       2016-04-09 23:03:13 +08:00
    超出了 JS 的安全值范围
    hayao650
        5
    hayao650  
    OP
       2016-04-09 23:07:23 +08:00 via Android
    @Exceptionluo
    @yxzblue
    了解了,谢谢弟
    magicdawn
        6
    magicdawn  
       2016-04-09 23:14:23 +08:00
    你的串是 56 位的, IEEE-754 安全值是 2^53 - 1, 怎么解决,拆开表示,或者找找 bigint 库,里面应该也是拆开表示
    hayao650
        7
    hayao650  
    OP
       2016-04-09 23:20:03 +08:00 via Android
    @magicdawn 谢谢
    ileenhow
        8
    ileenhow  
       2016-04-09 23:22:28 +08:00
    SoloCompany
        9
    SoloCompany  
       2016-04-10 06:03:04 +08:00 via iPhone
    js 在设计上对整数运算是有天然缺陷的
    因为为了简单它标准规范里面所有数字都是双精度浮点数
    假如它能支持 64bit 整数的话,十进制至少 18 位是没有问题的
    有整数运算要求的可以用 jsbn.js
    这个库很小,用了做 rsa 什么的都是 ok 的
    v2survive
        10
    v2survive  
       2016-04-10 08:21:08 +08:00 via Android
    还要传给后端而前端自己不用这个数字的话,再传到后端的时候可以考虑还是传 string
    hayao650
        11
    hayao650  
    OP
       2016-04-10 10:57:31 +08:00 via Android
    @v2survive 不知道他们为什么用 int ,前端后端都不是我写的,我只是加班无聊的时候帮着看看
    hayao650
        12
    hayao650  
    OP
       2016-04-10 10:58:11 +08:00 via Android
    @SoloCompany 好的,标记一下,学习学习
    hayao650
        13
    hayao650  
    OP
       2016-04-10 10:58:32 +08:00 via Android
    @ileenhow 谢了兄弟
    xieguanglei
        14
    xieguanglei  
       2016-04-14 19:13:39 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3275 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 10:53 PVG 18:53 LAX 02:53 JFK 05:53
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86