數學¶
數值類型¶
兩種最常見的數字類型是 Int32
和 Float64
。名稱中的數字表示大小(以位元為單位):Int32
是 32 位元的整數類型,Float64
是 64 位元的浮點數。
- 整數字面值寫成一系列一或多個十進位數字(
0-9
),沒有前導零。預設類型是Int32
。 - 浮點數值寫成一系列二或多個十進位數字(
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)