跳至内容

数学

数值类型

两种最常见的数字类型是 Int32Float64。名称中的数字表示以位为单位的大小:Int32 是一个 32 位 整数类型Float64 是一个 64 位 浮点数

  • 整数字面量写为一个或多个基数为 10 的数字(0-9),没有前导零。默认类型为 Int32
  • 浮点字面量写为两个或多个基数为 10 的数字(0-9),中间带有一个点 (.),表示小数点。默认类型为 Float64

所有数值类型都允许在中间的任何位置使用下划线。这对于以更易读的方式编写大数字很有用:100000 可以写为 100_000

p! 1, typeof(1)
p! 1.0, typeof(1.0)
p! 100_000, typeof(100_000)
p! 100_000.0, typeof(100_000.0)

浮点值打印带有小数点。整数值则没有。

信息

还有很多其他数值类型,但大多数仅用于特殊用例,例如二进制协议、特定数值算法和性能优化。对于日常程序,您可能不需要它们。

请参见 整数字面量参考浮点字面量参考,了解所有基本数字类型及其替代表示形式的完整参考。

算术运算

相等性和比较

具有相同数值的数字,无论其类型如何,在相等性运算符 == 方面都被视为相等。

p! 1 == 1,
  1 == 2,
  1.0 == 1,
  -2000.0 == -2000

除了相等性运算符之外,还有比较运算符。它们确定两个值之间的关系。与相等性一样,可比性也与类型无关。

p! 2 > 1,
  1 >= 1,
  1 < 2,
  1 <= 2

通用比较运算符是 <=>,也称为“太空船运算符”,因为它的外观像一艘太空船。它比较其操作数并返回一个值,该值要么为零(两个操作数相等),要么为正值(第一个操作数更大),要么为负值(第二个操作数更大)。它将所有其他比较运算符的行为结合在一起。

p! 1 <=> 1,
  2 <=> 1,
  1 <=> 2

运算符

基本算术运算可以使用运算符来执行。大多数运算符都是二元(即两个操作数),并以中缀表示法(即位于操作数之间)编写。一些运算符是一元(即一个操作数),并以前缀表示法(即位于操作数之前)编写。表达式的值为操作的结果。

p! 1 + 1, # addition
  1 - 1,  # subtraction
  2 * 3,  # multiplication
  2 ** 4, # exponentiation
  2 / 3,  # division
  2 // 3, # floor division
  3 % 2,  # modulus
  -1      # negation (unary)

如您所见,大多数整数操作数之间的操作结果也是整数值。除法运算符 (/) 是一个例外。它始终返回一个浮点值。但是,地板除运算符 (//) 返回一个整数值,但它显然被降低到整数精度。整数和浮点操作数之间的操作始终返回一个浮点值。否则,返回类型通常是第一个操作数的类型。

信息

可以在 运算符参考 中找到运算符的完整列表。

优先级

当组合多个运算符时,就会出现它们按什么顺序执行的问题。在数学中,有几个规则,例如乘法和除法优先于加法和减法。Crystal 运算符实现了这些优先级规则。

用于构造运算的工具是括号。括号中的运算符表达式始终优先于外部运算符。

p! 4 + 5 * 2,
  (4 + 5) * 2

信息

可以在 运算符参考 中找到所有优先级规则的详细信息。

数字方法

一些不太常见的数学运算不是运算符,而是命名方法。

p! -5.abs,   # absolute value
  4.3.round, # round to nearest integer
  5.even?,   # odd/even check
  10.gcd(16) # greatest common divisor

信息

可以在 Number API 文档 中找到数值方法的完整列表(还要检查子类型)。

数学方法

一些算术方法不是直接在数字类型上定义的,而是在 Math 命名空间中定义的。

p! Math.cos(1),     # cosine
  Math.sin(1),      # sine
  Math.tan(1),      # tangent
  Math.log(42),     # natural logarithm
  Math.log10(312),  # logarithm to base 10
  Math.log(312, 5), # logarithm to base 5
  Math.sqrt(9)      # square root

信息

可以在 Math API 文档 中找到数学方法的完整列表。

常量

一些数学常量作为 Math 模块的常量提供。

p! Math::E,  # Euler's number
  Math::TAU, # Full circle constant (2 * PI)
  Math::PI   # Archimedes' constant (TAU / 2)