# 算术运算符

算术运算符对两个操作数进行算术运算。

如果参考算术运算的其中一个操作数是字符串则尝试转换为数值运算，转换失败则抛出异常。字符串在自动转换为数值时，忽略首尾空白字符，空白字符串会转换为 0，自动转换数据类型时不会调用 `_tonumber` 元方法。请参考: [隐式数据类型转换](../variables-and-constants.md#type-coercion)

如果参考算术运算的操作数是数值、字符串以外的其他数据类型则查找该对象的元方法进行运算，如果对象并未定义元方法则抛出异常。 请参考： [重载操作符](overloading.md) [元方法](../datatype/table/meta.md)

算术运算符列表：

| 运算符 | 说明 |
| --- | --- |
| `+` | 加 |
| `-` | 减(二元运算符)、取负(单目运算符) |
| `*` | 乘 |
| `/` | 除 |
| `%` | 模 |
| `**` | 乘方 |

![](../../icon/info.gif)  要特别注意 `+` 运算符的规则： <a id="add" href="#add">&#x23;</a>

- 如果一个操作数是数值，而另一个操作数是字符串，则尝试将字符串转换为数值做算术相加运算，转换失败则报错。
- 如果两个操作数都是字符串，则尝试将两个操作数都转换为数值做算术相加运算，转换失败则改为字符串连接操作。不应依赖此规则做字符串连接，明确写为 `++` 可以避免不必要的转换，也可避免不必要的误操作。
- 引号（双引号、单引号、反引号）前后的 `+` 运算符将自动转换为字符串[连接运算符 ++](concat.md)

aardio 中的数值默认存储为 64 位浮点数（即原生类型中的 double 类型）。参考 [数据类型 - number](../variables-and-constants.md#number) 

在 aardio 中算术运算结果是 64 位浮点数（double），所以可能出现小数。我们可以使用 math.round 函数对计算结果四舍五入取整，也可以使用 math.floor 函数向下取整，或使用 math.ceil 函数向上取整。参考： [math 库函数](../../library-guide/builtin/math.md)

以整除为例，将用 `/` 运算符计算除法的结果转换为整数的 aardio 示例如下：

```aardio
import console; 

//整除
var num = math.round( 10 / 3 );

//在控制台显示计算结果
console.log("计算结果：" ,num);

console.pause(true);
```

**关于取模运算** <a id="mod" href="#mod">&#x23;</a>

aardio 取模运算符 `%` 的计算过程为 `a % b == a - ⌊a/b⌋ b`，在计算 ⌊a/b⌋ 这一步时对结果下取整（向负无穷大取整）。在 aardio 中 `a % b` 的结果与 `a - ( math.floor(a/b) * b)` 相同，`a % b` 运算结果的符号与 b 的符号相同。

> 不同编程语言的 `%` 运算符的规则并不完全相同， Python 的  `%` 运算符 与 aardio 相同，而 C 语言在计算  `a % b` 时使用的则是 a/b 向零取整的结果（ `a % b` 运算结果的符号与 a 的符号相同 ） 。

相关链接：[模式匹配 `%` 运算符](../../library-guide/builtin/string/patterns.html#balanced-strings) 



