|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
第008讲:数学运算
0. 本节视频
1. 算术运算符
基本的算术运算符:
- 加法运算符(+):将两个数值相加,或者将数值与字符串拼接。
- 减法运算符(-):将两个数值相减。
- 乘法运算符(*):将两个数值相乘。
- 除法运算符(/):将两个数值相除,如果除数为 0,则结果为 Infinity 或 -Infinity。
- 取余运算符(%):返回两数相除的余数。
- 自增运算符(++):将变量的值增加 1。
- 自减运算符(--):将变量的值减少 1。
- 求幂运算符(**):计算一个数的另一个数次幂。
注意,这个自增自减运算符,它放在操作数的前面和后面,效果是不一样的:
- > ++a
- 5
- > a
- 5
- > --b
- 3
- > b
- 3
复制代码
坦白讲,这个一不小心,就很容易被忽悠瘸了:
- > a = 3;
- 3
- > b = 5;
- 5
- > result = ++a + b--;
- 9
复制代码
解释一下:
++a 是一个前缀自增运算符,它首先将变量 a 的值从 3 增加到 4,然后使用这个增加后的值(4)进行后续的运算。
而 b-- 是一个后缀自减运算符,它首先使用变量 b 当前的值(5)进行运算,然后再将 b 的值从 5 减少到 4。
因此,整个表达式的运算相当于 4 + 5,结果为 9。
简而言之:
- 前缀自增、自减运算符是先改变变量的值,然后将更新后的值用于表达式求值。
- 后缀自增、自减运算符先将变量的当前值用于表达式求值,然后再修改变量的值。
在实际编程中,为了提高代码的可读性和避免混淆,通常建议将自增、自减操作与其他操作分开写,而不是合并在一个表达式中。
比如这里,我们可以拆分为三条语句:
- > ++a;
- > result = a + b;
- > b--;
复制代码
这样就更加清晰明了。
2. 数学运算
JavaScript 还提供了一个 Math 对象,包含了许多用于执行数学运算的工具。
比如求绝对值,可以使用 Math.abs():
- > Math.abs(250)
- 250
- > Math.abs(-250)
- 250
复制代码
四舍五入可以使用 Math.round():
- > Math.round(1.68)
- 2
- > Math.round(1.28)
- 1
复制代码
向上取整使用 Math.ceil():
- > Math.ceil(1.68)
- 2
- > Math.ceil(1.28)
- 2
复制代码
向下取整用 Math.floor():
- > Math.floor(1.68)
- 1
- > Math.floor(1.28)
- 1
复制代码
求一组数值的最大、最小值,使用 Math.max() 和 Math.min() 即可:
- > Math.max(1, 4, 2, 8, 5, 7)
- 8
- > Math.min(1, 4, 2, 8, 5, 7)
- 1
复制代码
求幂除了使用算术运算符,也可以使用 Math.pow() 函数:
- > Math.pow(2, 3)
- 8
- > Math.pow(2, -2)
- 0.25
- > Math.pow(8, 1/3)
- 2
复制代码
还有一些重要的数学常量,在 Math 对象中是有存储的:
- > Math.E
- 2.718281828459045
- > Math.PI
- 3.141592653589793
复制代码
像求对数、三角函数、双曲线这些,Math 也支持:
- > Math
- Math {abs: ƒ, acos: ƒ, acosh: ƒ, asin: ƒ, asinh: ƒ, …}
- E: 2.718281828459045
- LN2: 0.6931471805599453
- LN10: 2.302585092994046
- LOG2E: 1.4426950408889634
- LOG10E: 0.4342944819032518
- PI: 3.141592653589793
- SQRT1_2: 0.7071067811865476
- SQRT2: 1.4142135623730951
- abs: abs()
- acos: acos()
- acosh: acosh()
- asin: asin()
- asinh: asinh()
- atan: atan()
- atan2: atan2()
- atanh: atanh()
- cbrt: cbrt()
- ceil: ceil()
- clz32: clz32()
- cos: cos()
- cosh: cosh()
- exp: exp()
- expm1: expm1()
- floor: floor()
- fround: fround()
- hypot: hypot()
- imul: imul()
- log: log()
- log1p: log1p()
- log2: log2()
- log10: log10()
- max: max()
- min: min()
- pow: pow()
- random: random()
- round: round()
- sign: sign()
- sin: sin()
- sinh: sinh()
- sqrt: sqrt()
- tan: tan()
- tanh: tanh()
- trunc: trunc()
- Symbol(Symbol.toStringTag): "Math"
- [[Prototype]]: Object
复制代码
有鱼油说太多了,记不住,完全记不住
小甲鱼把这些的用法和案例都整理好放在速查宝典 -> Math对象用法大合集
大家可以收藏一下,这样在用到的时候打开查看就可以了。
3. 生成随机数
这里还有一个需要特别讲解的,那就是 Math.random(),用于生成一个介于 0 到 1 之间的伪随机数(包含 0,但不包含 1):
- > Math.random()
- 0.9486286273489641
- > Math.random()
- 0.28805359058967417
- > Math.random()
- 0.3161413574312941
复制代码
有同学说,就只能生成 0 到 1 之间的随机数啊,那有啥用,我想做个双色球生成器都不行?!
非也非也,只需要通过一些简单的数学运算,我们就可以调整这个范围以适应不同的应用场景。
比如我们要生成 100 以内的随机数,那么只需要将 Math.random() 的结果乘以 100 即可:
- > Math.random() * 100
- 60.80800295589466
- > Math.random() * 100
- 37.289265999333175
- > Math.random() * 100
- 11.299477450125428
复制代码
如果需要生成一个 100 到 250 之间的随机数,大家觉得应该怎么做?
没错,将结果先乘以 150,然后再加上 100:
- > Math.random() * 150 + 100
- 242.83116906172276
- > Math.random() * 150 + 100
- 188.45630664278843
- > Math.random() * 150 + 100
- 203.65609232312494
复制代码
如果想要整数呢?
容易!使用 Math.floor() 再加工一下就好了:
- > Math.floor(Math.random() * 150 + 100)
- 107
- > Math.floor(Math.random() * 150 + 100)
- 248
- > Math.floor(Math.random() * 150 + 100)
- 152
复制代码
注意:
Math.random() 生成的随机数是伪随机的,它生成的数字虽然表现出随机性,但实际上是由一个确定性的数学公式生成的,因此严格来说并不是真正的随机数。
对于一些对随机性要求严格的场景(如密码学、安全领域),可能需要使用更加安全和真正随机的随机数生成器。
4. 思维导图
|
|