最近在做项目的时候 遇到2个超长数字的问题 在这里总结下
- 问题一: app里的内嵌h5页面, IOS系统,超长数字颜色会变成蓝色
在iPhone 手机上默认值是(电话号码显示为拨号的超链接)
<meta name="format-detection" content="telephone=yes"/>
可将telephone=no,则手机号码不被显示为拨号链接
<meta name="format-detection" content="telephone=no"/>
- 问题二: JavaScript 里最大的安全的整数2的53次方减一
先说下问题:后端接口吐给前端一个sku字段, 字段类型为long ,值是29265918525710373,在特定场景下,需要前端回传这个字段给后端,这时后端收的是29265918525710374 而不是 29265918525710373 ,
可以看到 最后一位发生的变化,
导致问题的原因是,超长数据精确度出了问题,因为JavaScript 里最大的安全的整数2的53次方减一,
解决这个问题的方法,是后端接口修改sku字段为string,前端传串,就可以避免这种问题的发生了。
那么问题来了,JavaScript 里最大的安全的整数为什么是2的53次方减一(点击查看原文)
整数存在64位浮点数的52位尾数里面,难道不应该是2的52次方减一吗?
根据浮点数的存储原理,整数位第一位肯定是1,所以这个第一位就可以省略掉。因此多出了1位。这并不是JS特有的性质,而是IEEE754双精度浮点数就是这么定义的。
“安全”意思是说能够one-by-one表示的整数,也就是说在(-2^53, 2^53)范围内,双精度数表示和整数是一对一的,反过来说,在这个范围以内,所有的整数都有唯一的浮点数表示,这叫做安全整数。