JavaScript数值运算和类型转换

本文介绍JavaScript中数值的相关操作,如算术运算、整数的位运算、如何将其它类型转换为整数或浮点数、使用Math类进行数学计算,以及BigInt类型的应用等。

算术运算

算术运算是数值最常见的操作了,在JavaScript中的算术运算包括:

  • 加法运算,使用+运算符。
  • 减法运算,使用-运算符。
  • 乘法运算,使用*运算符。
  • 除法运算,使用/运算符。
  • 求余数,使用%运算符,如10%3=1、10%3.3=0.1。
  • 幂运算,使用**运算符,即x**y计算x和y次方,如2**3=8。也可以使用Math.pow()方法进行幂运算,如Math.pow(2,3)返回8。此外,幂运算还可以进行开方运算,计算x开n次方可以使用公式“x**(1/n)”,如27**(1/3)=3。

需要注意计算结果为浮点数时的精度问题,如10%3.3=0.1,在JavaScript代码中计算的结果是0.10000000000000053;实际应用中,计算的结果可以使用toFixed()方法指定结果的小数位数,如代码“(10 % 3.3).toFixed(2)”会保留2位小数,显示结果为0.10。

toFixed()方法的参数是保留的小数位数,多余的小数部分会四舍五入;此外,toFixed()方法返回的是字符串格式,比较适合在显示最终计算结果时使用。

整数的位运算

我们知道,在计算机中的数据在底层都是二进制形式,对整数进行二进制计算可以方便很多操作。JavaScript中,整数的位运算包括:

  • 位与(and),使用&运算符。两个运算数对应的二进位中,都是1时结果为1,有一个为0时结果为0。
  • 位或(or),使用|运算符。两个运算数对应的二进位中,有一个为1时结果为1,两个都为0时结果为0。
  • 位异或(xor),使用^运算符。两个运算数对应的二进位中,都为1或都为0时结果为0,一个为1一个为0时结果为1。
  • 按位取反(not),使用~运算符。只需要一个运算数,二进制位1变0,0变1。
  • 位左移运算,使用<<运算符。数据的二进制位向左移动,低位空出的数位补0。如x向左移动n位,相当于计算x*2n
  • 位右移运算,使用>>运算符。数据的二进制位向右移动,高位空出的数位补0。如x向右移动n位,相当于计算x÷2n
  • 保留符号位的右移运算,使用>>>运算符。对于有符号整数,二进制的最高(左)位就是符号位,符号位是0时数据为0或正整数,符号位是1时表示为负整数。使用>>>运算时,符号位保持不变,从第2位向右移动,空出的数位补0。

下面的代码,演示了如何使用位运算进行标识数据的操作。

JavaScript
<script>
    let s1 = 1, s2 = 2, s4 = 4, s8 = 8;
    let result = s1 | s8;  // 包含s1和s8标识
    alert(s1 & result);  // 1,包含s1标识
    alert(s2 & result);  // 0,不包含s2标识
</script>

代码中,首先定义了4个标识变量,请注意它们的数值都是2的次方,这样才能保证数据只使用一个二进制位,这里,1、2、4、8的二进制数的最后四位分别是0001、0010、0100、1000;然后,定义了变量result,其值使用s1和s8变量的位或操作,这样就组合了1和8,结果为十进制数9,有效的二进制数为1001;接下来,使用位与运算比较s1和result,即计算0001 & 1001,结果为0001,即十进制数据1,表示result中包含了s1;最后使用位与运算比较s2与result,即计算0010 & 1001,结果为0000,即十进制数0,表示result中不包含s2。

转换为数值类型

转换为数值类型时可以使用parseInt()函数和parseFloat()函数。

parseInt()函数的功能是将参数转换为整数,函数会从第一个字符开始处理,如果遇到非整数字符,则返回已转换的结果;如果参数内容完全无法转换为整数则返回NaN值,可以使用isNaN()函数判断。此外,null、true和false值转换时都会返回NaN值,浮点数转换为整数时只保留整数部分。下面的代码演示了parseInt()函数的应用。

JavaScript
<script>
    alert(parseInt("123abc")); // 123
    alert(parseInt("abc")); // NaN
    alert(parseInt("123")); // 123
    alert(parseInt("123.86")); // 123
    alert(parseInt(null)); // NaN
    alert(parseInt(true)); // NaN
    alert(parseInt(false)); // NaN
</script>

parseFloat()函数用于将参数转换为浮点数,其转换规则与parseInt()函数相似,下面的代码演示了parseFloat()函数的应用。

JavaScript
<script>
    alert(parseFloat("123.86abc")); // 123.86
    alert(parseFloat("abc")); // NaN
    alert(parseFloat("123")); // 123
    alert(parseFloat("123.86")); // 123.86
    alert(parseFloat(null)); // NaN
    alert(parseFloat(true)); // NaN
    alert(parseFloat(false)); // NaN
</script>

Math类

Math类封装了一些数学计算的常量和方法,下面分别介绍。

Math中的常量包括:

Math.PI,圆周率的值。

Math.E,常数e的值。

下面分类介绍一些常用的方法。

sign(n)方法,获取数值n的符号,0表示数值0,负数返回-1,正数返回1。

abs(n)方法,获取n的绝对值。

max(a,b,c,...)方法,可以设置多个参数,方法返回参数中的最大值。

min(a,b,c,...)方法,可以设置多个参数,方法返回参数中的最小值。

pow(x,y)方法,计算x的y次方,与**运算符功能相同。方法也可以计算开方,如计算x开n次方,可以使用Math.pow(x,1/n)。

random()方法,返回一个大于等于0且小于1的随机浮点数。需要返回一个指定范围的随机整数时,可以参考如下代码。

JavaScript
<script>
    function rndInt(min, max) {
        return Math.floor(Math.random()*(max - min + 1))+min;
    }
    //
    let arr = [];
    for (let i = 0; i < 100; i++) {
        arr.push(rndInt(0, 9));
    }
    alert(arr);
</script>

代码中,首先定义了rndInt()函数,它包括两个参数,min指定随机数的最小值,max指定随机数的最大值;接下来,使用for语句创建了100个0到9的随机数,并保存到arr数组中;最后使用alert()函数通过消息对话框显示这100个随机数。由于是随机数,所以,每次显示的结果并不一样。

round()方法,保留参数的整数部分,小数部分会四舍五入。

fround()方法,将参数转换为最接近的32位浮点数。

ceil()方法,向上取整,返回大于或等于参数的最小整数。

floor()方法,向下取整,返回小于或等于参数的最大整数。

trunc()方法,保留参数的整数部分,小数部分不会四舍五入。

clz32()方法,32位整数二进制格式前导0的位数,如Math.clz32(1)返回31、Math.clz32(-1)返回0。

sqrt()方法,求参数的算术平方根。

cbrt()方法,求参数的立方根。

imul(x,y)方法,计算x和y的乘积。其中x和y为32位整数。

hypot()方法,求所有参数的平方之和的平方根。如直角三角形两条直角边为3、4,可以使用Math.hypot(3,4)计算斜边的长度,结果为5。

exp(x)方法,求常数e的x次方。

log(x)方法,以常数e为底,求x的自然对数,x必须大于0。

log2(x)方法,计算以2为底的x的对数。

log10(x)方法,计算以10为底的x的对数

log1p(x)方法,以常数e为底,求1+x的自然对数。

expm1(x)方法,log1p(x)的逆运算。

sin()方法,返回以孤度为单位的角的正弦,角度转孤度的公式为“角度*Math.PI/180”。返回结果为-1到1。

cos()方法,计算余弦。

tan()方法,计算正切。

atan()方法,计算反正切。

sinh(x)方法,计算双曲线正弦。

cosh()方法,计算双曲余弦。

tanh()方法,计算双曲正切。

asinh()方法,计算反双曲正弦。

acosh()方法,计算双曲反余弦。

atanh()方法,计算双曲反正切。

BigInt类型

BigInt类型可以更好地处理64位整数,其字面量是在常规整数字面量后添加一个小写字母n,如11n、0b101n、0101n、0x1Fn。

BigInt类型的数据只能相互之间进行算术运算,其结果也是BigInt类型,这里需要注意的是除法运算,其计算结果为整数,余数部分舍去。

此外,在书写数值的字面量时,如果数字的位数太多、不易观察,可以使用下画线(_)分隔,如123_456_789、123_456n、0b101_110_111、0x123_456_116、12.345_678都是合法的数值字面量。