第008讲:数学运算
第008讲:数学运算0. 本节视频
https://www.bilibili.com/video/BV1dG411B7nG?p=9
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"
[]: Object
有鱼油说太多了,记不住,完全记不住 {:10_266:}
小甲鱼把这些的用法和案例都整理好放在速查宝典 -> 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. 思维导图
页:
[1]