O Swift disponibiliza duas categorias principais de números: os números inteiros e os números de vírgula flutuante.
0, 1, -1, 42 e -273.0.0, 3.14 e -1.36969e-10.Podes inserir underscores nos literais numéricos para melhorar a legibilidade: 1_000_000 é idêntico a 1000000.
Os literais de vírgula flutuante podem ser escritos em notação decimal ou exponencial.
Na maioria dos casos, usas Int para os números inteiros e Double para os números de vírgula flutuante:
let speed: Int = 42 // Explicit Int
let pi: Double = 3.14 // Explicit Double
let giga: Double = 1_000_000_000 // Double with readability underscores
let plancksConstant: Double = 6.62607015e-34 // Double in scientific notation
O Swift disponibiliza os operadores aritméticos habituais para cálculos numéricos:
| Operador | Descrição | Exemplo |
|---|---|---|
+ |
Adição |
4 + 6 dá 10
|
- |
Subtração |
15 - 10 dá 5
|
* |
Multiplicação |
2 * 3 dá 6
|
O Swift tem segurança de tipos e não permite misturar tipos numéricos diferentes nas operações aritméticas.
Não podes somar ou multiplicar diretamente um Int e um Double; tens primeiro de converter um dos tipos para que corresponda ao outro.
O operador / efetua a divisão.
Quando ambos os operandos são números inteiros, a divisão inteira trunca a parte fracionária:
5.0 / 2.0 // 2.5 (Double division)
5 / 2 // 2 (integer division truncates the remainder)
Dividir um número de vírgula flutuante diferente de zero por zero dá inf ou -inf.
Dividir 0.0 por 0.0 produz nan (Not a Number).
Em contrapartida, dividir um número inteiro por zero provoca um erro de compilação ou de execução:
print(5.0 / 0.0) // Prints inf
print(-5.0 / 0.0) // Prints -inf
print(0.0 / 0.0) // Prints nan
// The following line will not compile:
// print(5 / 0) // Error: Division by zero
O operador de resto (%) calcula o resto que sobra depois de dividir dois números inteiros:
5 % 2 // 1
-5 % 2 // -1
// Dividing by zero produces an error:
// 5 % 0 // Error: Division by zero
Em Swift, o % é um verdadeiro operador de resto, e não um operador de módulo.
O resultado tem sempre o sinal do primeiro operando (o dividendo), independentemente do sinal do segundo operando:
5 % -2 // 1
-5 % 2 // -1
Podes arredondar um número de vírgula flutuante com o método rounded().
Por predefinição, rounded() arredonda para o número inteiro mais próximo.
Também podes indicar uma regra de arredondamento específica, como .up ou .down:
let x = 3.14
let y = x.rounded() // 3.0
let w = x.rounded(.down) // 3.0
let z = x.rounded(.up) // 4.0
Quando declaras uma constante ou variável numérica sem uma anotação de tipo, o Swift infere o tipo:
Int por predefinição.Double por predefinição.let x = 42 // Inferred as Int
let y = 42.0 // Inferred as Double
let z: Double = 42 // Explicitly typed as Double
Para efetuar operações entre valores de tipos diferentes, converte um dos valores com inicializadores de tipo como Double(_:) ou Int(_:):
let integerCount = 42
let floatingCount = Double(integerCount)
print(floatingCount) // Prints 42.0
let pi = 3.14
let integerPi = Int(pi)
print(integerPi) // Prints 3 (fractional part is truncated)