Operador Mod (Visual Basic)

Divide dois números e retorna apenas o resto.

Sintaxe

result = number1 Mod number2

Partes

result
Obrigatórios. Qualquer variável ou propriedade numérica.

number1
Obrigatórios. Qualquer expressão numérica.

number2
Obrigatórios. Qualquer expressão numérica.

Tipos com suporte

Todos os tipos numéricos. Isso inclui os tipos de ponto flutuante e sem sinal e Decimal.

Result

O resultado é o restante após number1 ser dividido por number2. Por exemplo, a expressão 14 Mod 4 é avaliada como 2.

Observação

Há uma diferença entre o restante e o módulo em matemática, com resultados diferentes para números negativos. O operador Mod no Visual Basic, o operador .NET Framework op_Modulus e a instrução IL rem subjacente executam uma operação restante.

O resultado de uma operação Mod retém o sinal do dividendo, number1, e pode ser positivo ou negativo. O resultado está sempre no intervalo (-number2, number2), exclusivo. Por exemplo:

Public Module Example
   Public Sub Main()
      Console.WriteLine($" 8 Mod  3 = {8 Mod 3}")
      Console.WriteLine($"-8 Mod  3 = {-8 Mod 3}")
      Console.WriteLine($" 8 Mod -3 = {8 Mod -3}")
      Console.WriteLine($"-8 Mod -3 = {-8 Mod -3}")
   End Sub
End Module
' The example displays the following output:
'       8 Mod  3 = 2
'      -8 Mod  3 = -2
'       8 Mod -3 = 2
'      -8 Mod -3 = -2

Comentários

Se number1 ou number2 for um valor de ponto flutuante, o restante do ponto flutuante da divisão será retornado. O tipo de dados do resultado é o menor tipo de dados que pode conter todos os valores possíveis resultantes da divisão com os tipos de dados de number1 e number2.

Se number1 ou number2 for avaliada como Nothing, ela será tratada como zero.

Os operadores relacionados incluem o seguinte:

  • O operador \ (Visual Basic) retorna o quociente inteiro de uma divisão. Por exemplo, a expressão 14 \ 4 é avaliada como 3.

  • O operador / (Visual Basic) retorna o quociente completo, incluindo o restante, como um número de ponto flutuante. Por exemplo, a expressão 14 / 4 é avaliada como 3,5.

Tentativa de divisão por zero

Se number2 for avaliado como zero, o comportamento do operador Mod depende do tipo de dados dos operandos:

  • Uma divisão integral lança uma exceção DivideByZeroException se number2 não puder ser determinado em tempo de compilação e gera um erro em tempo de compilação BC30542 Division by zero occurred while evaluating this expression se number2 for avaliado como zero em tempo de compilação.
  • Uma divisão de ponto flutuante retorna Double.NaN.

Fórmula equivalente

A expressão a Mod b é equivalente a qualquer uma das seguintes fórmulas:

a - (b * (a \ b))

a - (b * Fix(a / b))

Imprecisão de ponto flutuante

Quando você trabalha com números de ponto flutuante, tenha em mente que eles nem sempre têm uma representação decimal precisa na memória. Isso pode levar a resultados inesperados de determinadas operações, como a comparação de valores e o operador Mod. Para obter mais informações, consulte Tipos de dados de solução de problemas.

Sobrecarga

O operador Mod pode ser sobrecarregado, o que significa que uma classe ou uma estrutura pode redefinir o comportamento. Se o código aplicar Mod a uma instância de uma classe ou estrutura que inclui essa sobrecarga, entenda o comportamento redefinido. Para obter mais informações, confira Procedimentos de operador.

Exemplo 1

O exemplo a seguir usa o operador Mod para dividir dois números e retornar apenas o restante. Se um dos números for um número de ponto flutuante, o resultado será um número de ponto flutuante que representa o restante.

Debug.WriteLine(10 Mod 5)
' Output: 0
Debug.WriteLine(10 Mod 3)
' Output: 1
Debug.WriteLine(-10 Mod 3)
' Output: -1
Debug.WriteLine(12 Mod 4.3)
' Output: 3.4
Debug.WriteLine(12.6 Mod 5)
' Output: 2.6
Debug.WriteLine(47.9 Mod 9.35)
' Output: 1.15

Exemplo 2

O exemplo a seguir demonstra a possível imprecisão dos operandos de ponto flutuante. Na primeira instrução, os operandos são Double, e 0,2 é uma fração binária infinitamente repetida com um valor armazenado de 0,20000000000000001. Na segunda instrução, o caractere de tipo literal D força ambos os operandos para Decimal e 0,2 tem uma representação precisa.

firstResult = 2.0 Mod 0.2
' Double operation returns 0.2, not 0.
secondResult = 2D Mod 0.2D
' Decimal operation returns 0.

Confira também