数学¶
数值类型¶
两种最常见的数字类型是 Int32
和 Float64
。名称中的数字表示以位为单位的大小: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)