format_bank_number: function(number){
return (number.toString()).substr(0,4)+"********"+(number.toString()).substr(-4);
}
为什么最后的9004变成9010了?
format_bank_number: function(number){
return (number.toString()).substr(0,4)+"********"+(number.toString()).substr(-4);
}
为什么最后的9004变成9010了?
Number
类型统一按浮点数处理,使用64位二进制位进行存储,如下图所示:
其中有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_INTEGER
及Number.MIN_SAFE_INTEGER
来表示安全整数范围的上下限,还增加了方法Number.isSafeInteger
来判断是否处于安全整数范围内。
你代码中的值明显已经超过这个范围了,所以丧失精度了,出现不可预料的情况,这么大的数字不适合用Number
类型
13 回答13k 阅读
7 回答2.1k 阅读
3 回答1.3k 阅读✓ 已解决
6 回答1.2k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
6 回答1.1k 阅读
最大安全整数: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运算结果正确。