为什么最后一个数字变了?

format_bank_number: function(number){
            return (number.toString()).substr(0,4)+"********"+(number.toString()).substr(-4);
        }

clipboard.png

为什么最后的9004变成9010了?

阅读 4.3k
8 个回答

最大安全整数:Number.MAX_SAFE_INTEGER(es6) === Math.pow(2,53)

1、JS中只有一种类型数,即64位(1bit 的符号位,11bits 的指数部分 ,以及52bits 的小数部分)双精度浮点数,当整数数值过大时,就会发生精度丢失。
2、所谓安全整数即能够唯一确定的数字,即能够使用64位二进制数唯一确定的整数。考虑2^53,转换成对应表示方式后其小数部分总共包括53位,发生了精度丢失,所以在JS中无法区别2^53与2^53+1;
3、安全整数与JS是否能够正确进行运算关系密切,当运算数与运算结果都处于安全整数的范围内时,才能保证JS运算结果正确。

clipboard.png
溢出了吧,这么长的还是用字符串吧,银行卡号一般不会用数字类型

超过最大值了吧 用字符串吧

这里应该是超过数字的最大值了,银行卡号一般存的不都是字符串吗?这个卡号是你们后台传给你的还是你从用户输入得到的

超过最大值了,转换成字符串类型吧

Number.MAX_SAFE_INTEGER
// 9007199254740991

超过这个值的数就不安全了,如果不参与计算就用文本保存吧

Number类型统一按浮点数处理,使用64位二进制位进行存储,如下图所示:

clipboard.png

其中有1位符号位,11位指数位,52位有效数字位,IEEE754规定,有效数字第一位默认总是1,即有效数字总是1.xx...xx的形式,其中第一位不进行存储,而xx..xx的部分保存在64位浮点数之中,最长可能为52位。因此,JavaScript实际提供的有效数字最长为53个二进制位,一个数字可以表示为:

(-1)^符号位 * 1.xx...xx * 2^指数位

有效数字精度最多只能到53个二进制位,这意味着,绝对值小于2的53次方的整数,即在-(Math.pow(2, 53) - 1)Math.pow(2, 53) - 1范围内的整数都可以精确表示(安全整数),而不在该范围内的整数则会丧失精度。

es6中增加了Number.MAX_SAFE_INTEGERNumber.MIN_SAFE_INTEGER来表示安全整数范围的上下限,还增加了方法Number.isSafeInteger来判断是否处于安全整数范围内。

你代码中的值明显已经超过这个范围了,所以丧失精度了,出现不可预料的情况,这么大的数字不适合用Number类型

所有ID性质的数据都应该用字符串模式,即使全是数字也不能用数字。否则处理中很容易出现问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题