Crystal 有各式各樣的數字型別,各有不同用途。舉例來說,有些型別速度較快,但可容納的值的範圍比其他的小。有些型別可容納的值的範圍較大,但速度較慢。
在 Crystal 中,帶號整數型別和無號整數型別都有。帶號整數型別可以是正數或負數。無號整數型別只能是正數。
以下是 Crystal 中的帶號整數型別:
| Type | Size (bits) | Range |
|---|---|---|
Int8 |
8 | -128 到 127 |
Int16 |
16 | -32_768 到 32_767 |
Int32 |
32 | -2_147_483_648 到 2_147_483_647 |
Int64 |
64 | -9_223_372_036_854_775_808 到 9_223_372_036_854_775_807 |
Int128 |
128 | -170_141_183_460_469_231_731_687_303_715_884_105_728 到 170_141_183_460_469_231_731_687_303_715_884_105_727 |
較小的型別使用的記憶體較少,速度也比大型別快,但可容納的值的範圍較小。
當你知道值會落在某個範圍內時,最好使用盡可能小的型別,以節省記憶體並提升效能。
預設的整數型別是Int32。若要宣告特定型別的整數,可以把型別名稱當作後綴,加上<number>_I <bit>。
1_i8.class
# => Int8
你可以使用to_i<bit>方法在不同的整數型別之間轉換。to_i方法會轉換成預設的整數型別Int32。
1_i8.to_i16.class
# => Int16
2_i16.to_i.class
# => Int32
以下是 Crystal 中的無號整數型別:
UInt8、UInt16、UInt32、UInt64、UInt128
帶號整數與無號整數唯一的差別在於,無號整數只能是正數。若要宣告特定型別的無號整數,可以把型別名稱當作後綴,加上<number>_u<bit>。你可以使用to_u<bit>方法在不同的無號整數型別之間轉換。to_u方法會轉換成預設的無號整數型別UInt32。
1_u8.to_u16.class
# => UInt16
以下是 Crystal 中的浮點數型別:
| Type | Size (bits) | Range |
|---|---|---|
Float32 |
32 | 1.2E-38 到 3.4E+38 |
Float64 |
64 | 2.3E-308 到 1.7E+308 |
這裡有兩種不同的浮點數型別,其中一種比另一種更精確。
預設的浮點數型別是Float64。
你可以使用to_f<bit>方法在不同的浮點數型別之間轉換。to_f方法會轉換成預設的浮點數型別Float64。
ESA(Exercism 太空總署)正全力規劃一趟前往火星衛星火衛一的新任務。 這項任務的目標是讓探測器降落在火衛一表面,並回傳關於該表面的資料。 ESA 請你協助打造探測器的導航電腦。 導航電腦的記憶體有限,所以我們得盡可能降低記憶體用量。 因此,我們需要選用合適的資料型態。
導航電腦需要知道太空中某些物體之間的距離,才能進行正確的計算,距離以公里為單位。
定義下列常數:
NEPTUNE_DISTANCE,值為 4_400_000_000,應以 Int64 儲存MARS_DISTANCE,值為 227_940_000,應以 Int32 儲存ATMOSPHERE_DISTANCE,值為 10_000,應以 Int16 儲存導航電腦需要知道太空中某些物體的面積,才能進行正確的計算。 面積不可能是負值。 工程師原本規劃讓程式在面積為負值時產生溢位錯誤。 不過,工程師忘了把有號整數改成無號整數。
因此,工程師希望有一個能把有號整數轉換成無號整數的程式。
請實作 Navigation#correct_area_analysis 方法,它接受 measurement 作為引數,並以 32 位元的無號整數回傳面積。
給定的面積一定可以用 32 位元的無號整數表示。
measurement = 52554
measurement.class
# => Int32
Navigation.new.correct_area_analysis(measurement)
# => 52554
Navigation.new.correct_area_analysis(measurement).class
# => UInt32
導航電腦需要知道探測器的速度。 速度以 m/s 為單位。
要計算速度,我們需要知道移動的距離,以及移動這段距離所花的時間。 接著,把距離除以時間。
速度不必很精確,也永遠不會是很大的數字。
因此,我們可以使用 Float32。
請實作 Navigation#calculate_velocity 方法,它接受 distance 和 time 作為引數,並以 32 位元的Float回傳速度。
distance = 52554
time = 2.5
Navigation.new.calculate_velocity(distance, time)
# => 21021.6
Navigation.new.calculate_velocity(distance, time).class
# => Float32