Ruby 零基础教程

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.0

1.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 遵循标准的数学运算顺序:

从最高优先级到最低优先级:

  1. 指数运算 (**)
  2. 乘法、除法、取模 (*, /, %)
  3. 加法、减法 (+, -)

如果表达式中出现了相同优先级的运算符,它们将从左到右进行计算。

使用括号 () 控制顺序:
你可以(并且强烈建议)使用括号来覆盖默认的优先级,并明确控制运算顺序,这能大幅提升代码的可读性。

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 += 3x = x + 3x = 8
-=减并赋值y = 10; y -= 4y = y - 4y = 6
*=乘并赋值z = 2; z *= 6z = z * 6z = 12
/=除并赋值a = 20; a /= 5a = a / 5a = 4
%=取模并赋值b = 17; b %= 5b = b % 5b = 2
**=指数并赋值c = 3; c **= 2c = c ** 2c = 9