Comecemos por uma divis?o normal:
var result = 3/2;
Conforme observou, esta opera??o tem resultado 1.5
, que n?o é o que queremos.
Para ter uma divis?o inteira, temos de decidir que tipo de arredondamento pretendemos usar.
As principais op??es s?o:
- Arredondar para baixo (por defeito). é esta a forma de arredondamento que o Ruby utiliza.
- Arredondar para o número mais próximo.
- Arredondar para cima (por excesso).
- Truncar o resultado (arredondar para baixo para números positivos, para cima para números negativos). Esta forma de arredondamento é muito comum na divis?o inteira de outras linguagens de programa??o, como o C.
Exemplo:
var arredondadoParaBaixo = Math.floor(3/2);
var arredondadoParaProximo = Math.round(3/2);
var arredondadoParaCima = Math.ceil(3/2);
Para truncar o resultado, temos mais de uma forma. A fun??o Math.trunc
foi introduzida no ECMAScript 6 (norma recente do JavaScript), mas esta fun??o é bastante recente pelo que n?o é universalmente suportada pelos navegadores de Internet.
Uma forma alternativa de truncar é "for?ar" o no a ser inteiro. Uma das formas mais simples de fazer isto é usar opera??es bit-a-bit, mas que n?o fa?am nada.
var truncado = (3/2)|0;
Isto faz a opera??o OU bit-a-bit com o número 0.
O "OU" converte o número para inteiro antes de realizar a opera??o mas, de resto, OU com 0 é como soma com 0 ou multiplica??o com 1 -- n?o faz nada.
Outras formas usadas incluem o ~~(3/2)
, o (3/2)^0
, o (3/2)<<0
e o (3/2)>>0
.
O (3/2)&0
n?o serve porque a opera??o E com 0 tem sempre resultado 0, que n?o é o que queremos.
Caso o resultado n?o caiba num inteiro de 32-bits com sinal (complemento de dois), a divis?o com truncatura ignora os restantes bits, pelo que o resultado pode ser diferente do esperado nesses casos (jsfiddle).
Caso estejamos perante uma divis?o por zero, os métodos floor
, round
, ceil
e trunc
n?o alteram o resultado (devolvendo, portanto, infinito ou NaN
), enquanto que a truncatura usando o |0
dá resultado 0
(jsfiddle).