Divisão de inteiros em VB.net vs. C#

Imaginem a seguinte instrução em VB.net:

Dim x as integer = 5 / 20 * 100

E em C#:

int x = 5 / 20 * 100;

Seria de esperar que ambas atribuíssem o mesmo resultado a x, no entanto verifica-se que em VB.net é atribuído a x o valor esperado de 25, mas em C#, x fica com o valor zero.

A diferença de resultados resulta do C# reduzir de imediato o resultado da divisão 5 / 20 a um inteiro, de onde resulta o valor 0 que absorve a multiplicação por 100.

Se mudarmos em C# para:

int x = 5M / 20M * 100;

int y = 5 / 20M * 100;

int z = 5M / 20 * 100;

Qualquer uma das variáveis x, y e z fica com o valor 25. Da mesma forma, no seguinte caso…

int a = 5;

int b = 20;

int c = a / b * 100;

c fica de novo com o valor zero, será necessário algo como…

int c = (int)((decimal)a / b * 100);

…para que c fique com o valor esperado de 25.

Mais do que alimentar guerras VB.net/C#, espero que este post sirva para alertar deste comportamento que não podemos classificar de incorrecto por parte do C# mas que pode provocar resultados inesperados  e nem sempre fáceis de detectar…

One thought on “Divisão de inteiros em VB.net vs. C#”

  1. So dava o mm resultado se usasses o mesmo operador nos 2 casos :)
    Em VB.NET (bah:p), e se n estou enganado, / efetua uma divisao e devolve ujm floating point. Para teres o mesmo resultado que tiveste em C# (resultado esse que, claro esta, e o correto :p), devias usar o operador \.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>