Partilhar via


Operador Mod (Visual Basic)

Divide dois números e retorna apenas o restante.

Sintaxe

result = number1 Mod number2

Partes

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

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

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

Tipos suportados

Todos os tipos numéricos. Isso inclui os tipos não assinados e de ponto flutuante e Decimal.

Result

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

Nota

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

O resultado de uma Mod operação retém o sinal do dividendo, number1e por isso pode ser positivo ou negativo. O resultado está sempre na gama (-number2, number2), exclusiva. 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

Observações

Se um ou number1number2 é um valor de vírgula flutuante, o restante de vírgula flutuante da divisão é 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 avalia como Nada, é tratado 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 / Operator (Visual Basic) retorna o quociente completo, incluindo o restante, como um número de vírgula flutuante. Por exemplo, a expressão 14 / 4 é avaliada como 3.5.

Tentativa de divisão por zero

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

  • Uma divisão integral lança uma DivideByZeroException exceção se number2 não puder ser determinada em tempo de compilação e gera um erro BC30542 Division by zero occurred while evaluating this expression em tempo de compilação se number2 for avaliada 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 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 vírgula flutuante, lembre-se de que eles nem sempre têm uma representação decimal precisa na memória. Isso pode levar a resultados inesperados de certas operações, como a comparação de valores e o Mod operador. Para obter mais informações, consulte Solução de problemas de tipos de dados.

Sobrecarga

O Mod operador pode estar sobrecarregado, o que significa que uma classe ou estrutura pode redefinir seu comportamento. Se seu código se aplica Mod a uma instância de uma classe ou estrutura que inclui tal sobrecarga, certifique-se de entender seu comportamento redefinido. Para obter mais informações, consulte Procedimentos do operador.

Exemplo 1

O exemplo a seguir usa o Mod operador para dividir dois números e retornar apenas o restante. Se um dos números for um número de vírgula flutuante, o resultado será um número de vírgula 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 imprecisão potencial de operandos de ponto flutuante. Na primeira instrução, os operandos são Double, e 0.2 é uma fração binária infinitamente repetitiva com um valor armazenado de 0.2000000000000001. Na segunda instrução, o caractere D de tipo literal 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.

Consulte também