Math数学函数
Math是数学常数属性和数学函数方法,Math不是一个函数对象,它只用于Number
类型,不支持BigInt
与其它全局对象不同的是,Math
不是一个构造器。Math
的所有属性与方法都是静态的。Math
的常量是使用 JavaScript 中的全精度浮点数来定义的。
属性
Math.PI // 圆周率,一个圆的周长和直径之比,约等于 3.14159
Math.E // 欧拉常数,也是自然对数的底数,约等于 2.718
Math.LN2 // 2 的自然对数,约等于 0.693
Math.LN10 // 10 的自然对数,约等于 2.303
Math.LOG2E // 2 为底的 E 的对数,约等于 1.443
Math.LOG10E // 10 为底的 E 的对数,约等于 0.434
Math.SQRT2 // 2 的平方根,约等于 1.414
Math.SQRT1_2 // 二分之一的平方根,约等于 0.707
方法
常用方法
Math.max(x1,x2,...n) // 最大值 取数组中最大元素 Math.max(...[1,2,3])或Math.max.apply(null, [1,2,3])
Math.min(x1,x2,...n) // 最小值
Math.random() // 0~1之间的伪随机数
Math.round(x) // 四舍五入后的整数
Math.floor(x) // 向下取整 返回小于或等于一个数
Math.ceil(x) // 向上取整 返回大于一个数的最小整数
Math.trunc(x) // 保留整数部分,去掉小数部分
Math.abs(x) // 绝对值
三角函数方法
sin()、cos()、tan()、asin()、acos()、atan()
Math.asin(x) // 反正弦值
Math.acos(x) // 反余弦值
Math.acosh(x) // 反双曲余弦值
其他方法
Math.imul(x, y) // 32位整数乘法的结果
Math.sign(x) // 返回一个数的符号,得知一个数是正数、负数还是0 负数返回-1 正数返回1 零返回0
Math.pow(x, y) // x的y次幂
Math.sqrt(x) // x的平方根
Math.cbrt(x) // x的立方根
Math.fround(x) // 返回最接近一个数的单精度浮点型表示。
Math.clz32(x) // 返回一个 32 位整数的前导零的数量。
案例
随机数生成算法
随机生成字符串
const str = Math.random().toString(36).substr(2) // 随机生成字符串
先是 Math.random()
生成 [0, 1) 的数,也就是 0.123312、0.982931之类的,然后调用 number
的 toString
方法将其转换成 36 进制的,按照 MDN
的说法,36 进制的转换应该是包含了字母 a~z 和 数字 0~9 的,因为这样生成的是 0.89kjna21sa
类似这样的,所以要截取一下小数部分,即从索引 2 开始截取 10 个字符就是我们想要的随机字符串了。
// 得到两个数之间的随机数
function getRandom(min, max) {
return Math.random() * (max - min) + min;
}
// 得到两个数之间的随机整数
function getRandom(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min)) + min; //不含最大值,含最小值
// return Math.floor(Math.random() * (max - min + 1)) + min; //含最大值,含最小值
}
Math.random()
不能提供像密码一样安全的随机数字。不要使用它们来处理有关安全的事情。使用Web Crypto API
来代替,采用更精确的window.crypto.getRandomValues()
方法
高精度比较
二进制数字32位和64位表示 会存在精度不一致,在某些精度不高的场合下,可以通过将二个浮点数转换成32位浮点数进行比较,以解决64位浮点数比较结果不正确的问题:
0.1 + 0.2 == 0.3; //false
function equal(v1, v2) {
return Math.fround(v1) == Math.fround(v2);
}
equal(0.1 + 0.2, 0.3); //true