二进制与八进制
在JS中如何把十进制转化为二进制?
const a = 5
console.log(a.toString(2)); // 101
如何把二进制转化为十进制?
const b = 101
console.log(parseInt(b,2)); // 5
ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示。
ES5中严格模式下,进制的数不允许前缀用0表示
const a = 0101 // Legacy octal literals are not allowed in strict mode
const a = 0B0101
console.log(a); // 5
const b = 0o777
console.log(b); // 511
新增方法
Number.isFinite()
用来检查一个数值是否为有限的(finite),即不是Infinity.如果当前判断的数据类型是数,那么就判断这个数是不是有限的,如果当前的数据类型不是数就返回false
console.log(Number.isFinite(5));
console.log(Number.isFinite(0.5));
console.log(Number.isFinite(Infinity)); // 判断无限的是不是有限的
console.log(Number.isFinite('lee'));
console.log(Number.isFinite(true));
Number.isNaN()
用来检查一个值是否为NaN。
ES5中很多方法都是挂在window上,eg:window.isNaN()
,这样存在的问题就是让全局对象window变得越来越大,不利于模块化管理。ES6中会将全局的方法,逐步的移动到相应的对象上,eg:Number、String、Math等
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN(5)); // false
Number.parseInt() && Number.parseFloat()
console.log(Number.parseInt(5.5)); // 5
console.log(Number.parseFloat(5.5)) // 5.5
console.log(parseInt(5.5)); // 5 相当于调用window.parseInt(5.5)
console.log(parseFloat(5.5)) // 5.5 相当于调用window.parseInt(5.5)
Number.isInteger()
用来判断一个数值是否为整数。
console.log(Number.isInteger(5)); // true
console.log(Number.isInteger(5.2)); // false
0.1 + 0.2 === 0.3 ???
数学中是没错的,但是在计算机中数字是如何存储和运算的?
在计算机中,不管是整数还是浮点数,都是以二进制进行存储的,计算机只认识0和1
0.1 + 0.2 // 0.30000000000000004
在ES中会采用IEEE754双精度标准去存储,存储一个数字需要的二进制数字位数比较多,这样做的目的是为了更加精确
把35用一个8位的二进制数表示 00100011
把0.375用二进制表示 0.011
把0.1转成二进制数, 由于无法整除,转成二进制数 ===> 0.000110011…
由于存储空间是有限的因此要舍弃省略号后面无法整除的数
因此得到的只是一个近似值
eg:
console.log(0.1000000000000001); // 小数点后面14个0 结果:0.1000000000000001
console.log(0.10000000000000001); // 小数点后面15个0 结果:0.1
console.log(0.10000000000000001 === 0.1); // true
由于后面的数超出了它存储的范围,那么后面的就会被舍掉
因此0.1 + 0.2 不等于0.3,因为当前的0.1被转成二进制数存在电脑中存在精度缺失,真正存的只是0.1的近似值,所以最后进行加法的时候得到的结果是一堆0和一个4
Number.MAX_SAFE_INTEGER
返回一个最大值的常量
ES中整数的最大值是2^53次方,因此从下图中可以知道:如果那不是最大值,显示的就是最大值+1后的结果,但是结果是不变的
const max = Math.pow(2,53)
console.log(max); // 9007199254740992
console.log(max + 1); // 9007199254740992
console.log(Number.MAX_SAFE_INTEGER === max -1); // true
Number.MIN_SAFE_INTEGER
返回一个最小值的常量
ES中整数的最小值是-2^53次方
Number.isSafeInteger()
判断一个数是否在安全的区间内,JavaScript 能够准确表示的整数范围在-2^53到2^53之间(不含两个端点),超过这个范围,无法精确表示这个值。
console.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER)); // true
console.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1)); // false
console.log(Math.pow(2, 53) === Math.pow(2, 53) + 1); // true
Math扩展
Math.trunc()
用于去除一个数的小数部分,返回整数部分。那么它和parseInt()有什么区别呢?Math.trunc(xxx)它会将xxx先转成number类型,如果遇到不能转成number也返回NaN
console.log(Math.trunc(true)); // 1
console.log(Number.parseInt(true)); // NaN
console.log(Math.trunc(false)); // 0
console.log(Number.parseInt(false)); // NaN
console.log(Math.trunc(NaN)); // NaN
Math.sign()
方法用来判断一个数到底是正数、负数、还是零。对于非数值,会先将其转换为数值。
它会返回五种值。
- 参数为正数,返回+1
- 参数为负数,返回-1
- 参数为 0,返回0
- 参数为-0,返回-0
- 其他值,返回NaN
console.log(Math.sign(6)); // 1
console.log(Math.sign(-6)); // -1
console.log(Math.sign(0)); // 0
console.log(Math.sign(NaN)); // NaN
console.log(Math.sign(true)); // 1
console.log(Math.sign(false)); // 0
Math.cbrt()
用于计算一个数的立方根。
console.log(Math.cbrt(8)); // 2
console.log(Math.cbrt('leee')); // NaN
原文链接:https://juejin.cn/post/7233310081809825853 作者:仗剑走天涯_