本文介绍JavaScript中数值的相关操作,如算术运算、整数的位运算、如何将其它类型转换为整数或浮点数、使用Math类进行数学计算,以及BigInt类型的应用等。
算术运算是数值最常见的操作了,在JavaScript中的算术运算包括:
需要注意计算结果为浮点数时的精度问题,如10%3.3=0.1,在JavaScript代码中计算的结果是0.10000000000000053;实际应用中,计算的结果可以使用toFixed()方法指定结果的小数位数,如代码“(10 % 3.3).toFixed(2)”会保留2位小数,显示结果为0.10。
toFixed()方法的参数是保留的小数位数,多余的小数部分会四舍五入;此外,toFixed()方法返回的是字符串格式,比较适合在显示最终计算结果时使用。
我们知道,在计算机中的数据在底层都是二进制形式,对整数进行二进制计算可以方便很多操作。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()函数的应用。
<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()函数的应用。
<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.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的随机浮点数。需要返回一个指定范围的随机整数时,可以参考如下代码。
<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类型可以更好地处理64位整数,其字面量是在常规整数字面量后添加一个小写字母n,如11n、0b101n、0101n、0x1Fn。
BigInt类型的数据只能相互之间进行算术运算,其结果也是BigInt类型,这里需要注意的是除法运算,其计算结果为整数,余数部分舍去。
此外,在书写数值的字面量时,如果数字的位数太多、不易观察,可以使用下画线(_)分隔,如123_456_789、123_456n、0b101_110_111、0x123_456_116、12.345_678都是合法的数值字面量。