介绍
数字在编程中很常见。 它们用于表示诸如:屏幕尺寸尺寸、地理位置、金钱和积分、视频中经过的时间量、游戏头像的位置、通过分配数字代码的颜色等等。
在编程中有效地执行数学运算是一项需要培养的重要技能,因为您使用数字的频率很高。 尽管对数学的高层次理解当然可以帮助您成为更好的程序员,但这不是先决条件。 如果您没有数学背景,请尝试将数学视为完成您想要实现的目标的工具,以及提高逻辑思维的一种方式。
我们将使用 Go 中最常用的两种数字 数据类型 、 整数 和 floats:
本教程将回顾我们可以在 Go 中与数字数据类型一起使用的运算符。
运营商
operator 是表示操作的符号或函数。 例如,在数学中,加号或 +
是表示加法的运算符。
在 Go 中,我们会看到一些熟悉的数学运算符。 但是,我们将使用的其他运算符特定于计算机编程。
这是 Go 中与数学相关的运算符的快速参考表。 我们将在本教程中介绍以下所有操作。
手术 | 它返回什么 |
---|---|
x + y
|
x 和 y 之和
|
x - y
|
x 和y 的区别
|
-x
|
x 的符号改变
|
+x
|
x 的身份
|
x * y
|
x 和y 的乘积
|
x / y
|
x 和 y 的商
|
x % y
|
x / y 的余数
|
我们还将介绍复合赋值运算符,包括 +=
和 *=
,它们结合了算术运算符和 =
运算符。
加减
在 Go 中,加法和减法运算符的执行方式与数学中的一样。 实际上,您可以将 Go 编程语言用作计算器。
让我们看一些例子,从整数开始:
fmt.Println(1 + 5)
Output6
除了将整数直接传递给 fmt.Println
语句之外,我们还可以使用如下语法初始化变量以代表整数值:
a := 88 b := 103 fmt.Println(a + b)
Output191
因为整数既可以是正数也可以是负数(也可以是 0),我们可以将负数与正数相加:
c := -36 d := 25 fmt.Println(c + d)
Output-11
加法的行为与浮点数类似:
e := 5.5 f := 2.5 fmt.Println(e + f)
Output8
因为我们将两个浮点数加在一起,所以 Go 返回了一个带小数位的浮点值。 但是,由于在这种情况下小数位为零,因此 fmt.Println
删除了小数格式。 为了正确格式化输出,我们可以使用 fmt.Printf
和动词 %.2f
,它将格式化为两位小数,如下例所示:
fmt.Printf("%.2f", e + f)
Output8.00
减法的语法与加法相同,只是我们将运算符从加号 (+
) 更改为减号 (-
):
g := 75.67 h := 32.0 fmt.Println(g - h)
Output43.67
在 Go 中,我们只能对相同的 数据类型 使用运算符。 我们不能添加 int
和 float64:
i := 7 j := 7.0 fmt.Println(i + j)
Outputi + j (mismatched types int and float64)
尝试对不同的数据类型使用运算符将导致编译器错误。
一元算术运算
一元数学表达式仅由一个组件或元素组成。 在 Go 中,我们可以将加号和减号用作与值配对的单个元素:返回值的标识 (+
),或更改值的符号 (-
)。
虽然不常用,但加号表示值的标识。 我们可以使用带有正值的加号:
i := 3.3 fmt.Println(+i)
Output3.3
当我们将加号与负值一起使用时,它也会返回该值的标识,在这种情况下,它将是一个负值:
j := -19 fmt.Println(+j)
Output-19
对于负值,加号返回相同的负值。
但是,减号会更改值的符号。 因此,当我们传递一个正值时,我们会发现该值前面的减号将返回一个负值:
k := 3.3 fmt.Println(-k)
Output-3.3
或者,当我们使用带负值的减号一元运算符时,将返回一个正值:
j := -19 fmt.Println(-j)
Output19
由加号和减号指示的一元算术运算将在 +i
的情况下返回值的标识,或者在 -i
的情况下返回值的相反符号。
乘法和除法
像加减法一样,乘法和除法看起来与它们在数学中的表现非常相似。 我们将在 Go 中用于乘法的符号是 *
,我们将用于除法的符号是 /
。
这是在 Go 中使用两个浮点值进行乘法的示例:
k := 100.2 l := 10.2 fmt.Println(k * l)
Output1022.04
在 Go 中,除法具有不同的特征,具体取决于我们要划分的数字类型。
如果我们要对整数进行除法,Go 的 /
运算符会执行地板除法,其中商 x 返回的数字是小于或等于 x 的最大整数。
如果您运行以下除法 80 / 6
的示例,您将收到 13
作为输出,并且数据类型将为 int
:
package main import ( "fmt" ) func main() { m := 80 n := 6 fmt.Println(m / n) }
Output13
如果所需的输出是浮点数,则必须在除法之前显式转换值。
您可以通过在您的值周围包装所需的浮点类型 float32()
或 float64()
来做到这一点:
package main import ( "fmt" ) func main() { s := 80 t := 6 r := float64(s) / float64(t) fmt.Println(r) }
Output13.333333333333334
模数
%
运算符是 模,它返回余数而不是除法后的商。 这对于查找是同一数字的倍数的数字很有用。
让我们看一个模数的例子:
o := 85 p := 15 fmt.Println(o % p)
Output10
为了打破这一点,85
除以 15
返回 5
与 10
余数的商。 我们的程序在这里返回值 10
,因为模运算符返回除法表达式的余数。
要使用 float64
数据类型进行模数运算,您将使用 math
包中的 Mod
函数:
package main import ( "fmt" "math" ) func main() { q := 36.0 r := 8.0 s := math.Mod(q, r) fmt.Println(s) }
Output4
运算符优先级
在围棋中,就像在数学中一样,我们需要记住,运算符将按优先顺序进行计算,而不是从左到右或从右到左。
如果我们看下面的数学表达式:
u = 10 + 10 * 5
我们可以从左到右读取它,但乘法将首先完成,所以如果我们要打印 u
,我们将收到以下值:
Output60
这是因为 10 * 5
的计算结果为 50
,然后我们添加 10
以返回 60
作为最终结果。
相反,如果我们想将值 10
添加到 10
,然后将该和乘以 5
,我们在 Go 中使用括号,就像在数学中一样:
u := (10 + 10) * 5 fmt.Println(u)
Output100
记住操作顺序的一种方法是通过首字母缩写词 PEMDAS:
命令 | 信 | 代表 |
---|---|---|
1 | P | 括弧 |
2 | E | 指数 |
3 | M | 乘法 |
4 | D | 分配 |
5 | A | 添加 |
6 | S | 减法 |
您可能熟悉操作顺序的另一个首字母缩写词,例如 BEDMAS 或 BODMAS。 无论什么首字母缩略词最适合您,在 Go 中执行数学运算时尽量记住它,以便返回您期望的结果。
赋值运算符
最常见的赋值运算符是您已经使用过的:等号 =
。 =
赋值运算符将右边的值赋给左边的变量。 例如,v = 23
将整数 23
的值赋给变量 v
。
编程时,通常使用复合赋值运算符对变量的值执行操作,然后将生成的新值赋给该变量。 这些复合运算符结合了算术运算符和 =
运算符。 因此,对于加法,我们将 +
与 =
组合得到复合运算符 +=
。 让我们看看它是什么样子的:
w := 5 w += 1 fmt.Println(w)
Output6
首先,我们设置变量w
等于5
的值,然后我们使用+=
复合赋值运算符将右边的数字加上左边变量的值,然后将结果分配给 w
。
在 for
循环中经常使用复合赋值运算符,当您想多次重复一个过程时会使用它:
package main import "fmt" func main() { values := []int{0, 1, 2, 3, 4, 5, 6} for _, x := range values { w := x w *= 2 fmt.Println(w) } }
Output0 2 4 6 8 10 12
通过使用 for
循环遍历名为 values
的切片,您可以自动执行将变量 w
乘以的 *=
运算符的过程数字 2
然后将结果分配回变量 w
。
对于本教程中讨论的每个算术运算符,Go 都有一个复合赋值运算符。
要添加然后分配值:
y += 1
要减去然后分配值:
y -= 1
乘以然后赋值:
y *= 2
要除然后分配值:
y /= 3
要返回余数,然后分配值:
y %= 3
当需要逐步增加或减少事物时,或者当您需要自动化程序中的某些过程时,复合赋值运算符会很有用。
结论
本教程涵盖了您将与整数和浮点数值数据类型一起使用的许多运算符。 您可以在 Understanding Data Types in Go 和 How To Convert Data Types 中了解有关不同数据类型的更多信息。