Ruby 基础算术运算
本章将涵盖 Ruby 中的核心算术运算符、它们的优先级,以及如何将它们与不同的数值数据类型(整数和浮点数)结合使用。我们还会探讨一些常见的陷阱和最佳实践,以确保你的代码能进行准确且高效的计算。
1. 核心算术运算符
Ruby 提供了一套用于执行基本算术计算的运算符。这些运算符适用于各种数值数据类型。
1.1 加法 (+) 和 减法 (-)
- 加法 (
+): 将两个数字相加。 - 减法 (
-): 用第一个数字减去第二个数字。
# 加法
puts 5 + 3 # 输出: 8
puts 2.5 + 7.5 # 输出: 10.0
# 减法
puts 10 - 4 # 输出: 6
puts 8.2 - 2.2 # 输出: 6.01.2 乘法 (*) 和 除法 (/)
- 乘法 (
*): 将两个数字相乘。 - 除法 (
/): 用第一个数字除以第二个数字。
关键注意点:整数除法
在 Ruby 中,如果参与除法的两个操作数都是整数,结果也会被强制截断为整数(直接丢弃小数部分,而不是四舍五入)。
# 乘法
puts 6 * 7 # 输出: 42
puts 3.5 * 2 # 输出: 7.0
# 除法
puts 15 / 3 # 输出: 5
puts 17 / 5 # 输出: 3 (由于两个都是整数,小数部分 .4 被直接丢弃)如何获得精确的浮点数除法结果?
如果你希望得到带小数的结果,必须确保至少有一个操作数是浮点数(Float)。
puts 17.0 / 5 # 输出: 3.4 (浮点数除法)
puts 17 / 5.0 # 输出: 3.4 (浮点数除法)1.3 取模/求余 (%)
- 取模 (
%): 返回除法运算后的余数。
这个运算符在编程中非常有用,例如用来判断一个数字是奇数还是偶数,或者将循环的值限制在特定范围内。
puts 16 % 5 # 输出: 1 (16 除以 5,商为 3,余数为 1)
puts 10 % 2 # 输出: 0 (余数为 0,说明是偶数)
puts 11 % 2 # 输出: 1 (余数为 1,说明是奇数)1.4 指数/幂运算 (**)
- 指数 (
**): 计算第一个数字的第二个数字次方。
puts 2 ** 3 # 输出: 8 (2 * 2 * 2)
puts 5 ** 2 # 输出: 25 (5 的平方)
puts 2 ** 0.5 # 输出: 1.4142135623730951 (计算 2 的平方根)2. 运算符优先级 (Operator Precedence)
运算符优先级决定了表达式中运算执行的先后顺序。Ruby 遵循标准的数学运算顺序:
从最高优先级到最低优先级:
- 指数运算 (
**) - 乘法、除法、取模 (
*,/,%) - 加法、减法 (
+,-)
如果表达式中出现了相同优先级的运算符,它们将从左到右进行计算。
使用括号 () 控制顺序:
你可以(并且强烈建议)使用括号来覆盖默认的优先级,并明确控制运算顺序,这能大幅提升代码的可读性。
puts 2 + 3 * 4 # 输出: 14 (先算乘法 3*4,再算加法)
puts (2 + 3) * 4 # 输出: 20 (括号强制先算加法 2+3)3. 混合类型计算:整数与浮点数
如前文除法部分所述,Ruby 会区分整数(whole numbers)和浮点数(带有小数点的数字)。
当你在算术运算中混合使用这两种类型时,Ruby 通常会自动将整数转换为浮点数,从而产生一个浮点数结果,以保证精度不丢失。
a = 10
b = 3
c = 3.0
puts a / b # 输出: 3 (纯整数除法)
puts a / c # 输出: 3.3333333333333335 (混合类型,产生浮点数结果)4. 复合赋值运算符 (Compound Assignment)
我们在“变量”那一章简要提到过复合赋值运算符。它们将算术运算和赋值操作结合在一起,提供了一种极其简洁的方式来更新变量的值。
| 运算符 | 描述 | 示例 | 等同于 | 结果 |
|---|---|---|---|---|
+= | 加并赋值 | x = 5; x += 3 | x = x + 3 | x = 8 |
-= | 减并赋值 | y = 10; y -= 4 | y = y - 4 | y = 6 |
*= | 乘并赋值 | z = 2; z *= 6 | z = z * 6 | z = 12 |
/= | 除并赋值 | a = 20; a /= 5 | a = a / 5 | a = 4 |
%= | 取模并赋值 | b = 17; b %= 5 | b = b % 5 | b = 2 |
**= | 指数并赋值 | c = 3; c **= 2 | c = c ** 2 | c = 9 |