JavaScript 安全整数问题

在使用Extjs做后台功能时遇到一个问题,数值在控制器显示正常,但在页面渲染时变为了错误值。经过排查,发现是JavaScript的安全整数问题。JavaScript的安全整数范围在-2^53到2^53-1之间,超过这个范围,JavaScript无法精确表示整数。解决方案是将整数转为字符串。文章介绍了JavaScript数字的存储方式,包括分数、指数和最大安全整数的概念,并通过示例探讨了超出安全整数范围后的表示问题。
摘要由CSDN通过智能技术生成

 

前几天在用Extjs 做后台功能的时候 碰到了一个非常坑爹的问题。 

 有个值在控制器显示的是

但是一到页面渲染就会变成

 

垃圾的我一开始以为是溢出问题 但是如果是数据库的溢出不是应该在存数据的时候会有这个问题吗。 而不是在显示数据的时候。如果是Javasript的溢出那么返回的结果是无穷大才对。而且uuid字段在数据库存储的类型是bigint(21) bigint的取值范围在-2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 

 

解决的方法很简单就是在取数据的时候把int 强转成string 就可以解决了。但是总得知道下原因哇 不然怎么装逼!!!

 

一、安全整数

php中的字符串到浏览器中会解析成Javascript的字符串,PHP中的整型在浏览器中会解析成Javascript的数字类型。这就涉及到了Javascript中的安全整数问题。

安全整数的概念是关于JavaScript中如何表示数学整数

在范围-2^53(-9007199254740992)到2^53(9007199254740992)之间JavaScript的整数是安全的

(1)有数学整数以及它们在JavaScript表示之间的一对一的映射。

(2)超出此范围,JavaScript整数是不安全的:两个或多个数学整数表示为同一JavaScript整数。

eg:

在浏览器中从2^53开始,JavaScript只能表示第二个数学整数

原因在于

在JavaScript中的数字表示为

                                  尾数×2 ^指数

尾数和指数提供53位整数,但是,可以使用较高的指数表示较高的整数。例如,指数增加1(乘以2)的整数的53位范围变为54位范围。但是,如上所述,现在只能表示第二个整数。而且

在浏览器中从2^54开始,JavaScript只能表示第四个数学整数

所以安全整数的概念就是可以明确表示单个数学整数的整数。

现在在看下我出问题的例子

 23 4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值