资讯专栏INFORMATION COLUMN

警告:小心巨型数字的溢出异常

liaorio / 2196人阅读

摘要:今天遇到个问题后端设置了一个数字在中。果不其然,的输出是。很明显,这应该是溢出的问题,能处理的数字都是浮点数,超出范围则会忽略了。

今天遇到个问题:后端设置了一个 id=32132132132132112(数字) 在 cookie 中。

我为了偷懒,用了个第三方组件去解析 cookie,然后发现这个数字被解析出来变成了 32132132132132110

百思不得其解,这么一个简单的 cookie parse 的组件怎么会发生这么奇怪的问题。

翻了下源码发现有这么一句:JSON.parse(xxx)
果不其然,JSON.parse(32132132132132112) 的输出是 32132132132132110

很明显,这应该是溢出的问题,JS 能处理的数字都是浮点数,超出范围则会忽略了。

JS中整数的数字范围是 -2^53~2^53, 超出则视为 2^53 处理,注意这个并不会报错,所以如果你在使用巨型数字前没有意识到这个问题,意味着项目上线后,你将可能丢失用户数据。

所以遇到这种问题,要么限制数字输入在可控范围内,要么在不需要计算的时候,将这种数字串存为字符串,要么使用一些能处理巨型计算的库来解决问题,比如 https://github.com/jtobey/javascript-bignum 或 https://www.npmjs.com/package/json-bigint

参考资料:https://www.irt.org/script/1031.htm

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79857.html

相关文章

  • 一次线上问题排查所引发思考

    摘要:直到有一天你会碰到线上奇奇怪怪的问题,如线程执行一个任务迟迟没有返回,应用假死。正好这次借助之前的一次生产问题来聊聊如何排查和解决问题。本地模拟上文介绍的是线程相关问题,现在来分析下内存的问题。尽可能的减少多线程竞争锁。 showImg(https://segmentfault.com/img/remote/1460000015568421?w=2048&h=1150); 前言 之前或...

    levy9527 评论0 收藏0
  • Java 常见内存溢出异常与代码实现

    摘要:堆堆是用来存储对象实例的因此如果我们不断地创建对象并且保证和创建的对象之间有可达路径以免对象被垃圾回收那么当创建的对象过多时会导致内存不足进而引发异常上面是一个引发异常的代码我们可以看到它就是通过不断地创建对象并将对象保存在中防止其被 Java 堆 OutOfMemoryError Java 堆是用来存储对象实例的, 因此如果我们不断地创建对象, 并且保证 GC Root 和创建的对象...

    whatsns 评论0 收藏0
  • 【阅读笔记】JavaScript语言精粹

    摘要:对之前看高级程序设计时没有注意到的一些知识点,结合本书做以补充语法注释源于的型既可以出现在字符串字面量中,也可能出现在正则表达式字面量中,如故一般建议使用型注释保留字语句变量参数属性名运算符和标记等标识符不允许使用保留字,此外在对象字面量中 对之前看《JavaScript高级程序设计》时没有注意到的一些知识点,结合本书做以补充 语法 注释 源于PL/I的/* */型既可以出现在字符串字...

    cucumber 评论0 收藏0
  • JS 整型你懂了吗?

    摘要:浮点数并不是能够精确表示范围内的所有数的,虽然浮点型的范围看上去很大。但其实浮点数在保存数字的时候做了规格化处理,以进制为例小数点前只需要保留位数对于二进制来说,小数点前保留一位,规格化后始终是节省了,这个并不需要保存。 JS 中的最大安全整数是多少? JS 中所有的数字类型,实际存储都是通过 8 字节 double 浮点型 表示的。浮点数并不是能够精确表示范围内的所有数的, 虽然 ...

    yuanxin 评论0 收藏0

发表评论

0条评论

liaorio

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<