二进制和八进制表示法

es6提供了新的表示方法:

数字:503

二进制

111110111    //es5

0b111110111    //es6

八进制

767    //es5

0o767    //es6

也就是加了个前缀,二进制前缀是:0b,八进制前缀是:0o,后面的字母大写也是可以的,都一样。

isFinite()和isNaN()

is开头一般都是用于判断的,这两个方法为Number对象新增的两个方法, isFinite用于判断数字是否为有限的数字,isNaN就判断值是否为NaN

需要注意的是,这两个方法和以前的方法不同,他们不会先转换值为number类型再进行比对,而是直接判断,不为数字就返回false。

Number.isFinite() 有限数字

Number.isFinite(15.6)    true
Number.isFinite(15)    true
Number.isFinite('15')    false
Number.isFinite(NaN)    false
Number.isFinite(Infinity)    false
Number.isFinite(-Infinity)    false

Number.isNaN() 无限数字

Number.isNaN(15.6)    false
Number.isNaN(NaN)    true
Number.isNaN('15')    false
Number.isNaN(9/NaN)    true
Number.isNaN('true'/0)    true
Number.isNaN('true'/'true')    true

isNaN判断的是最终那个值,所以错误的算法得到的NaN会被正确判断到。

parseInt()和parseFloat()

parseInt作为一个es5中全局的方法,用于去除浮点数。

parseFloat作为一个es5中全局的方法,用于将字符串转换为数字。

parseInt(15.6)     15

parseFloat('15.6@')   15.6

es6为了使语言模块化,在逐步的减少全局性方法,所以这两个方法可以直接通过Number对象调用,当然他们的使用是等价的,所以推荐通过Number对象使用该方法。

Number.parseInt(15.6)     15

Number.parseFloat('15.6@')   15.6

isInteger()

用于判断一个数字是否为整数,他也是不会自动将值进行隐式转换为number类型的。

需要注意的是,由于整数和浮点数在js里面的,存储的方式是一样的,所以3和3.0是相等的,会被识别为整数,而3.1则不行

Number.isInteger(15)    true
Number.isInteger(15.0)    true
Number.isInteger(15.6)    false
Number.isInteger('15.6')    false
Number.isInteger(true)    false

EPSILON() 预设误差

js的浮点运算,他基本上算的不是精确的,所以他会有误差,然后Number.EPSILON()他相当于官方给定的一个误差范围,小于这个误差范围就被认为计算得到了正确结果。

Number.EPSILON() 

//2.220446049250313e-16

所以我们可以想到这样一个公式。

2.1+2.9=5;

2.1+2.9-5=0;

这是我们的基本认识,但是在js里面,浮点数计算得到值就不是这样了,所以需要做个判断

let num = 2.1+2.9-5;
if(num > Number.EPSILON() ) {
  console.log("结果不准确");
}else {
  console.log("结果准确");
}

那么我们可以将它封装成一个方法

function withinErrorMargin(left,right){
  return Math.abs(left - right) < Number.EPSILON();
}

withinErrorMargin(2.1+2.9,5);  //true

安全整数和isSafeInteger()

js的数值能被精确显示的,是有范围的,在-2的53次方和2的53次方之间,不包含两个端点。

在超出这个范围后,数值就不精确了。

es6引入了两个常量来表示这两个上限:

  1. Number.MAX_SAFE_INTEGER === Math.pow(2,53) -1
  2. Number.MIN_SAFE_INTEGER === -(Math.pow(2,53) - 1)

    isSafeInteger()方法则是判断这个值是否在这个安全范围内。

但是使用的时候我们需要注意,要对所有需要计算的值进行判断,不然一个超出范围的值,去计算另一个值,得到的值也是不精确的,那么你对这结果进行isSafeInteger判断,实际上没有什么意义了。

所以isSafeInteger在判断数值是否在安全整数范围内,除了判断计算结果,还要验证参与运算的每个值。

Math对象扩展

trunc() 去除浮点数

es5对去除浮点数有点麻烦,因为正数和负数去除浮点数是不一样的方法,所以es6做了统一方法。

不管数字是正数还是负数,都能去除浮点数,但是如果值为空,或者NaN,string字符串这种无法被转换为number然后截取的,统一返回NaN

也就说说该方法也会先将参数转为数字类型,再进行截取。

Math.trunc(15.6)   15
Math.trunc(-15.6)   -15
Math.trunc(15.9)   15
Math.trunc('15.6')   15
Math.trunc('foot')   NaN
Math.trunc()   NaN
Math.trunc(NaN)   NaN

当然我们也可以使用es5自己封装一个方法

Math.trunc = Math.trunc || function(x){
  return x < 0 ? Math.ceil(x) : Math.floor(x);
}

sign()

sign是一个判断参数是正数,负数,0,的一个方法,对于无法判断的,统一返回NaN。

sign会先将参数转为数值在进行判断,如果是正数,就返回+1,负数返回-1,0的话也有正负,返回+0或者-0

Math.sign(5)   +1
Math.sign(-5)   -1
Math.sign(0)   +0
Math.sign(-0)   -0
Math.sign('9')   +1
Math.sign('foo')   NaN
Math.sign()   NaN

cbrt()

用于计算一个数的立方根,他也会先将参数转为数字,再计算,无法计算的统一返回NaN。

Math.cbrt(-1)   -1
Math.cbrt(0)   0
Math.cbrt(1)   1
Math.cbrt(2)   1.2599210498948734
Math.cbrt('2')   2
Math.cbrt('foo')   NaN
Math.cbrt()   NaN

clz32()

返回一个数32位无符号整数形式有多少个前导0

Math.clz32(0)   32
Math.clz32(1)   31
Math.clz32(1000)   22
Math.clz32(0b01000000000000000000000000000000)   1
Math.clz32(0b00100000000000000000000000000000)   2
Math.clz32('foo')   32
Math.clz32()   32
Math.clz32(NaN)   32
Math.clz32([])   32
Math.clz32({})   32
Math.clz32(true)   32

他就是将参数转为32位,然后计算前导零位数。

imul()

返回两个数以32位带符号整数形式相乘的结果,返回的也是一个32位的带符号整数

Math.imul(2,4)   8
Math.imul(-1,8)   -8
Math.imul(-2,-2)   4
Math.imul(0x7fffffff,0x7fffffff)   1

简单点理解为,他是一个安全整数的乘法,在安全整数返回内,返回的值就是正常乘法得到的值,但是当数值超出了安全范围,统一返回1这个在二进制里面最低位数字。

fround()

这个方法返回一个数的单精度浮点数形式。

Math.fround(0)   0
Math.fround(1)   1
Math.fround(1.337)   1.3370000123977661
Math.fround(1.5)   1.5
Math.fround(NaN)   NaN

对于整数参数,fround返回的结果是相同的,而带有浮点数的,他会返回最接近这个小数的单精度浮点数。

hypot()

返回所有参数的平方和的平方根

Math.hypot(3,4)  5
Math.hypot(3,4,5)   7.0710678118654755
Math.hypot(0)   0
Math.hypot(NaN)   NaN
Math.hypot(3,4,'foo')   NaN
Math.hypot(3,4,'5')   7.0710678118654755
Math.hypot(-3)  3

以第一个例子来讲,他就是 3的平方加4的平方之和,再开根号得到其值。

√(3*3)+(4*4) = √9+16 = √25 = 5

指数运算符

es6新增了一个指数运算符**,他的意思就是平方,后面接几个平方。

2 ** 2  //4   也就是2的2次方
2 ** 3  //8  2的3次方

**这个符合也可以和=等于号结合,和+=这些一样的意思

let a = 1.5;

a **= 2  // a=2.25;  等同于 a = a*a
注意,该方法和Math.pow()方法实现方式不同,所以对于特别大的运算,两者的结果会有细微差异。

Integer

js中数值精确度是有范围限制的,这使得他不能进行科学和金融方面的精确计算,现有一个提案,引入一个新的数据类型Integer(整数类型),该类型只用来表示整数,没有位数限制,任何位数的整数都可以精确表示。

为了和Number类型进行区分,整数类型的数值末尾需要加上字符n来表示

1n
2n
0b1101n
0o777n
0xFFn

js也提供转换的方法

Integer(123)  123n
Integer('123')  123n
Integer(false)  0n
Integer(true)  1n
Integer()  TypeError
Integer(undefined)  TypeError
Integer(null)  TypeError
Integer('123n')  SyntaxError
Integer('abc')  SyntaxError

整数的计算,可以套用Number大部分方法,其运算结果也是相同,但是有一些方法不支持。

  1. >>>右位移运算不支持
  2. +一元求正不支持

整数Integer类型无法和Number类型一起计算。

1n+1  //报错

因为这两种数据类型,都会丢失信息,整数会丢失所有的浮点数,Number超过返回,精确度就会下降。

==相等符号不能再整数类型中使用

1n == 1  //报错

因为相等他会转换数据的类型,所以也是不允许混合使用的,但是全等是可以使用的

1n === 1  //false

目前测试这个整数暂时浏览器还没支持,有空再进行详细的测试。

分类: ES6 标签: numberMathInteger浮点数整数数字

评论

暂无评论数据

暂无评论数据

目录